2011-04-26 47 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。