2015-08-29 26 views
-1

有人可以告訴我爲什麼我的程序不斷得到錯誤的答案嗎?它必須計算總和中進位操作的數量。我試過每個測試用例都出現在我的腦海裏。我沒有得到錯誤的輸出。計數進位操作

問題描述:

孩子們被教導要從右到左的一個數字一次添加多位數。許多人發現「攜帶」操作 - 其中1從一個數字位置被攜帶到下一個位置 - 是一個重大挑戰。你的工作是計算一組附加問題中每一個的攜帶操作次數,以便教育者可以評估它們的難度。

輸入

每行輸入包含兩個小於10位數的無符號整數。輸入的最後一行包含0 0

輸出

對於除了最後你應該計算並打印進位操作,將導致從將兩個數的數輸入的每一行,在以下所示的格式。

採樣輸入

123 456 
555 555 
123 594 
0 0 

樣本輸出

No carry operation. 
3 carry operations. 
1 carry operation. 

這裏是我當前的代碼:

#include<stdio.h> 
int main() 
{ 
    unsigned long long int a,b,m,n,rem_m,rem_n,judge=0,sum,count; 
    while((scanf("%llu%llu",&m,&n))==2) 
    { 
     if(m==0 && n==0) 
     { 
      break; 
     } 
     count=0; 
     while(m!=0 && n!=0) 
     { 
      rem_m=m%10; 
      rem_n=n%10; 
      if(judge==1) 
      { 
       rem_m++; 
      } 
      sum = rem_m+rem_n; 
      judge=0; 
      if(sum>=10) 
      { 
       count++; 
       judge++; 
      } 
      m=m/10; 
      n=n/10; 
     } 
     if(count==0) 
     { 
      printf("No carry operation.\n"); 
     } 
     else 
     { 
      printf("%llu carry operations.\n",count); 
     } 
    } 
    return 0; 
} 
+2

那麼是什麼問題?沒有得到「0 0」的答案? – CIsForCookies

+0

編譯時,始終啓用所有警告(對於gcc,至少:'-Wall -Wextra -pedantic'),然後修復警告。例如:對於發佈的代碼,編譯器會警告未使用的變量'a'和未使用的變量'b'。強烈建議將每個變量聲明放在單獨的行中,以便我們可讀性和便於記錄。 – user3629249

+0

代碼應該在開始時提供適當的提示輸出。否則用戶只剩下一個閃爍的光標,並且沒有指示他們應該下一步該做什麼。 – user3629249

回答

1

循環條件是錯誤的。你想要while(m!=0 || n!=0)(即,而其中至少有一個不爲零))而不是while(m!=0 && n!=0),否則對於999 9等錯誤的回答會錯誤地停止一次迭代並報告1攜帶操作,而正確答案應該是3.想想這樣:你只想在這兩個都是0時停止,所以只要至少有一個數不爲0就必須繼續循環。

另外,你忘了清理打印後輸出judge。您需要在再次讀取輸入之前清除它,或者您可能錯誤地使用了以前一次以carry結尾的計算(此變量的名稱選擇對我來說似乎很古怪,您應該將其重命名爲更有意義的內容,如carry,但它是這不是主要問題)。

ab未使用(您應啓用編譯器警告)。

當計數爲1時,樣本輸出顯示單詞操作(如,單數)你的程序總是寫操作(複數)。如果您將此內容提交給自動裁判,則代碼將無法通過,因爲輸出與預期輸出不完全匹配。爲了解決這個問題小的小細節,替換此:

else 
{ 
    printf("%llu carry operations.\n",count); 
} 

有了:

else 
{ 
    printf("%llu carry operation%s.\n",count, count > 1 ? "s" : ""); 
} 

這裏是固定的版本:

#include <stdio.h> 

int main(void) 
{ 
    unsigned long long int m,n,rem_m,rem_n,judge=0,sum,count; 
    while((scanf("%llu%llu",&m,&n))==2) 
    { 
     if(m==0 && n==0) 
     { 
      break; 
     } 
     count=0; 

     /* We want || here, not && */ 
     while(m!=0 || n!=0) 
     { 
      rem_m=m%10; 
      rem_n=n%10; 
      if(judge==1) 
      { 
       rem_m++; 
      } 
      sum = rem_m+rem_n; 
      judge=0; 
      if(sum>=10) 
      { 
       count++; 
       judge++; 
      } 
      m=m/10; 
      n=n/10; 
     } 

     /* Clean up for next iteration */  
     judge = 0; 

     if(count==0) 
     { 
      printf("No carry operation.\n"); 
     } 
     else 
     { 
      printf("%llu carry operations.\n",count); 
     } 
    } 
    return 0; 
} 
+0

接受...感謝您的幫助... :) –