2011-04-26 42 views
-1

我正在学习C,我很难理解循环和模的用法。我知道Loops是用来缩短程序的,而Modulo用来排除剩下的部分。我的任务是“编写一个C程序来查找单个正整数的总和”。循环和模

我刚花了几个小时试图了解这个问题。我也尝试过。

 
    int n,d=0,s=0; 
    printf("\nEnter a number\n\n"); 
    scanf("%d",&n);

while(n>0) { d = n%10; s = s+d; n = n/10; } printf("\n sum of the individual digits = %d",s);

我的问题是:

谁能帮助我理解这个程序的流程?为什么使用Modulo?和为什么有N = N/10

Experiements我已经做:

当我除去d = N%10;输出结果会打印出数字。因此它不计算。

即123 = 6 - >它给我136​​

当我除去线N = N/10这不是表示我的输出。 printf语句有一个参数's'

在此先感谢!

+0

尝试在调试器下逐行运行您的代码(保持监视变量'n','d'和's')。 – pmg 2011-04-26 22:57:24

+0

如果你删除'd = n%10',它会打印'0',因为你永远不会修改's',它最初是'0'。如果删除'n = n/10',它将永远循环,因为你永远不会修改'n',然后它总是> 0。一些实验可能有用,但很难看出它们是如何实现的。更好的办法是插入printf语句,告诉你每个步骤中的各种值(或学习使用调试器)。 – 2011-04-27 02:44:43

回答

6

以在d = n % 10模使得d等于n在基座10 n = n/10最后数字去除n的最后一位数字。

Modulo本质上是取其余的,所以我们假设n = 123。然后n/1012n % 103

卸下n = n/10意味着n不循环的每次运行之间发生变化,所以循环条件n > 0始终为true,因此循环持续下去,直到你手动终止程序。

下面是程序跟踪n = 123。最初ds都是零。

while (n > 0) { // n is 123, which is greater than zero, so we enter the loop 
    d = n % 10; // 123 % 10 is 3, so d is now 3 
    s = s + d; // 0 + 3 is 3, so s is now 3 
    n = n/10; // 123/10 is 12, so n is now 12. 
}    // go back to the top of the loop 
while (n > 0) { // n is 12, which is still greater than zero 
    d = n % 10; // 12 % 10 is 2, so d is now 2 
    s = s + d // 3 + 2 is 5, so s is now 5 
    n = n/10; // 12/10 is 1, so n is now 1 
}    // go back to the top again 
while (n > 0) { // n is 1, which is still greater than zero 
    d = n % 10; // 1 % 10 is 1, so d is now 1 
    s = s + d; // 5 + 1 is 6, so s is now 6 
    n = n/10; // 1/10 is 0, so n is now 0 
}    // go back to the top 
while (n > 0) { // n is 0, which is not greater than zero, so we skip 
        // to after the loop body 
printf("\n sum of the individual digits = %d",s); 
+0

@hammer - 视觉表示可能有所帮助。我很难理解它。你能举个例子,告诉我它是如何计算的吗? – 2011-04-26 23:10:00

+1

@Dylan尝试在纸上查找少量数字的过程。这可能会帮助你了解正在发生的事情。先用12然后用123,然后用1234.可以把12想象成十二个有多少个10?一,余数2.这是一个模数购买你的部门。 – jonsca 2011-04-26 23:34:13

+0

谢谢@hammer! – 2011-04-27 01:34:39

2

想象一下,你有一张纸,上面有一个孔,它的大小足以显示一个数字。要获得数字的总和,您必须将该纸张放在您的编号上,以便显示个位数字。你在某个地方写下这个数字。然后你将你的号码向右滑动,这样十位数就在洞下。您将其添加到您记下的前一位数字,依此类推,直到没有更多数字剩下为止。

带孔的纸片是模数运算,每一步向右滑动的数字是除法运算。

并给出一个计算的具体例子:

说这个数字是576。

576 % 10 = 6 

所以我们剔去6,我们添加到0°的运行总和来获得6.然后你以10做整数除法:

576/10 = 57 

现在你该模:

57 % 10 = 7 

所以我们剔去7和可以添加到的6运行总和得到13然后,它的整数除以10再次:

57/10 = 5 

又一次模:

5 % 10 = 5 

我们已经摘下了最后一位,并把它添加到正在运行的总和拿到18 - 的数字的总和。然后,我们除以10再:

5/10 = 0 

而且因为这是零,循环条件(n > 0)现在是假的,我们结束了。

所以模数被用来挑选当前数字的最右边的数字,并且该分数被用来使每个数字依次成为最右边的数字。

0

尝试这些:

int n = 12; 
printf("%d\n", n/10); 

int j = 12; 
printf("%d\n", j % 10); 

int x = 13; 
x = x/10; // right hand side of "=" get evaluated first 
printf("%d\n", x); 

观察在各种情况下的输出。

关于你提到的最后一点:

while (n > 0) 
{ 
    // some code. 
} 

这意味着:虽然n的值大于零运行some code。现在,如果你不改变nsome code将永远运行。 HTH。