【2013年11月12号】日记
1 /* 一个数如果恰好等于它的因子之和, 则这个数称为“完数”。 编写程序写出1000以内的完数; 2 我一开始错误的程序*/ 3 #include <stdio.h> 4 int main() 5 { 6 int i, j, ,sum=0; 7 8 for(i=2; i<1000; i++) 9 { 10 for(j=1; j<i; j++) 11 { 12 if(i%j==0) 13 sum+=j; //错误之处, sum没有还原成0; 导致sum是所有因子的和 14 } 15 if(sum==i) 16 printf("%d\n", i); 17 } 18 19 return 0; 20 } 21 /* 22 在Vc++6.0中的输出结果是: 23 Press any key to continue 24 */
这个程序的错误之处是个比较简单的错误, 但当时自己思考了很长时间也没想到, 归根结底原因还是自己的懒惰, 没有按照郝斌老师说的一步一步用一些数来实验, 而是自己一味的空想, 导致没有找到, 引此为鉴!
心得:以后如果遇到自己无法调试错误的程序, 一定得一步一步的用数去试,脚踏实地,直至成功!

1 /* 2 正确的程序(在李方的帮助下) 3 */ 4 #include <stdio.h> 5 int main() 6 { 7 int i, j, sum; 8 9 for(i=2; i<1000; i++) 10 { 11 for(j=1,sum=0; j<i; j++) // 关键的一步:将sum的值在因子循环的时候赋为零 12 { 13 if(i%j==0) 14 sum+=j; 15 } 16 if(sum==i) 17 printf("%d\n", i); 18 } 19 20 return 0; 21 }
第二个程序:
1 /* 2 用40元钱买西瓜、苹果和梨共100个,且三种水果都有。已知苹果0.4元一个, 西瓜4元一个, 梨0.2元一个。问可以买多少个? 3 */ 4 #include <stdio.h> 5 int main() 6 { 7 int x, y, z; 8 if(x+y+z==100) //错误之处:没有给x y z赋值, 计算机不会自动去试数 9 if(0.4*x+4*y+0.2*z==40) 10 { 11 printf("x = %d\n", x); 12 printf("y = %d\n", y); 13 printf("z = %d\n", z); 14 } 15 16 return 0; 17 } 18 /* 19 Press any key to continue 20 */
心得:编程序时要给里面的变量通过赋值来让计算机进行判断,而不是直接让计算机去试数。

1 #include <stdio.h> 2 3 int main() 4 { 5 int x, y, z; 6 7 for(x=1; x<98; x++) 8 { 9 for(y=1; y<98; y++) 10 { 11 z = 100-x-y; 12 if(0.4*x+4*y+z*0.2==40) 13 printf("%d, %d, %d\n", x, y, z); 14 } 15 } 16 17 return 0; 18 }