我姐给我出了一道题,让我去编一个韩信点兵的程序
学了循环结构后,总算编出来了
警告!有大量膜法
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
………………
时间: 2024-10-25 15:45:19