標籤:
我姐給我出了一道題,讓我去編一個韓信點兵的程式
學了迴圈結構後,總算編出來了
警告!有大量膜法
1 #include <stdio.h> 2 3 int main() 4 { 5 int A,a; 6 int B,b; 7 int C,c; 8 int D; 9 printf("有一數,除以\n");10 11 scanf("%d",&A);12 printf("餘\n");13 scanf("%d",&a);14 15 printf("除以\n");16 scanf("%d",&B);17 printf("餘\n");18 scanf("%d",&b);19 20 printf("除以\n");21 scanf("%d",&C);22 printf("餘\n");23 scanf("%d",&c);24 25 26 for(D=c; D%B != b; D += C);27 for(; D%A != a; D += A*C);28 printf("顯然地,這個數是%d\n",D);29 return 0;30 }
為了加入中文,沒有意義地寫了這麼長……
核心結構只是兩個for語句
26 for(D=c; D%B != b; D += C);27 for(; D%A != a; D += A*C);
大寫的ABC是除數,小寫abc是D除以它們的餘數
期間也因為中英文字元輸入混亂而被迫一個雙引號一個雙引號的改正
也有其他的基本語法錯誤,慢慢地改正
最終得到了正確的結果
但是
問題:
舉個例子
有一數
除8
餘3
除5
餘2
除7
餘3
猜猜結果會是多少?
227?
顯然程式將無限迴圈下去,直到D達到int的最大上限
讓我用手工推一下
D=3
D%5 =3 不等於2
D=10
D%5 =0
不等於2
D=17
D%5=2
第一步迴圈完成
進入第二個for語句
D%8=1
不等於3
D =17+7*8
D = 73
D%8 =1
不等於3
D = 129
D%8 = 1
等等,怎麼還是等於1?
我像個老人一樣的坐在床邊兒 沮喪了很久
無奈寫了另一個版本
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int A,a; 7 int B,b; 8 int C,c; 9 int D;10 puts("今有一數");11 12 puts("除以");13 scanf("%d",&A);14 puts("餘");15 scanf("%d",&a);16 17 puts("除以");18 scanf("%d",&B);19 puts("餘");20 scanf("%d",&b);21 22 puts("除以");23 scanf("%d",&C);24 puts("餘");25 scanf("%d",&c);26 27 28 for( D=0 ; D < A*B*C ; ++D )29 {30 if( D%A == a && D%B == b && D%C == c)31 {32 printf("顯然地,這個數是%d", D );33 break ;34 }35 }36 37 38 return 0;39 }
採用窮舉果然比較穩妥,雖然比較慢
過了很久
我重新分析了一下第一個方法
顯然第一個for是要求一數膜模B餘b,模C餘c
然後第二個for是求該數在模B與C有b與c的同時膜模A餘a
但是
27 for(; D%A != a; D += A*C);
為什麼是 D+=A*C?
……………………
居然敗在了一個低級錯誤上
改為 D+= B*C後很簡單就排除了這個bug
………………
【C】韓信點兵