1 /* 2 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 3 找出1000以内的所有完数。 4 */ 5 #include <stdio.h> 6 7 //int elem[10]; 8 9 int main() 10 { 11 int tmp=0,s,j,k=0; 12 int elem[10]; 13 // int tmp=0,s,j,k=0; 14 15 for(tmp=0; tmp<10; tmp++) 16 { 17 elem[tmp]=0; 18 } 19 20 for(tmp=2; tmp<1000; tmp++)//经典100例里从2开始的。 21 { 22 //n=-1; 23 s=tmp;k=0; 24 for(j=1; j<=tmp; j++) 25 { 26 //if(s==0) 27 // break; 28 29 if((tmp%j)==0) 30 { 31 //n++; 32 s-=j; 33 elem[k++] = j; 34 //printf("Q"); 35 } 36 } 37 38 if(s==0) 39 { 40 printf("%d is a wanshu:",tmp); 41 j=0; 42 while(j<k) 43 { 44 printf("%d,",elem[j]); 45 elem[j]=0; 46 j++; 47 //printf("Q"); 48 } 49 printf("\n"); 50 } 51 printf("%d\n",tmp);//输出当前tmp的值 52 system("pause"); //任意键继续 53 // printf("\n\n"); 54 } 55 56 return 0; 57 }
运行环境:codebloks
结果当前的tmp突然从59变成30:
如果上面的图上1的位置,设置成release这样,是可以的:
如果定义成全局的变量,无论1是那种情况都是正确的。
int elem[10];
int main()
如果定义成一个static的形式,也是正确的:
int main()
{
int tmp=0,s,j,k=0;
static int elem[10];
请问这是不是本身编译器的问题?
配置编译器的问题吧,明显debug和release的配制不一样吧
忘说了:在linux下运行的结果与这个是一个样的!在linux下可不分debug与release直接:
gcc -Wall -g filename.c -o filename
./filename
结果还是这样的!
不知道这样是不是能够消除你对配置的怀疑!
这个问题可能真是编译器的问题!?
不过楼主的代码中for(j=1; j<=tmp; j++)
应该为for(j=1; j<tmp; j++),如果包括tmp应该你永远也得不到结果的
高手犀利呀!你说的是对的,这样改才是正确的。
for(j=1; j<tmp; j++)
否则:
当j==tmp的时候,
29 if((tmp%j)==0)
是成立的。那么
32 s-=j;
s就会少于0,这样一来,直接导致下面的:
38 if(s==0)
不成立,那么也就得不到结果。
高手指正,多谢!