首页 新闻 会员 周边

求 "完数" 的时候:编译的时候出现一个奇特现象

0
悬赏园豆:10 [待解决问题]
 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];

 

请问这是不是本身编译器的问题?

 
zhengmian的主页 zhengmian | 初学一级 | 园豆:192
提问于:2012-05-10 15:57
< >
分享
所有回答(2)
0

配置编译器的问题吧,明显debug和release的配制不一样吧

sinhbv | 园豆:2579 (老鸟四级) | 2012-05-10 16:00

忘说了:在linux下运行的结果与这个是一个样的!在linux下可不分debug与release直接:

gcc -Wall -g filename.c -o filename

./filename

结果还是这样的!

不知道这样是不是能够消除你对配置的怀疑!

支持(0) 反对(0) zhengmian | 园豆:192 (初学一级) | 2012-05-10 18:12
0

这个问题可能真是编译器的问题!?

不过楼主的代码中for(j=1; j<=tmp; j++)
应该为for(j=1; j<tmp; j++),如果包括tmp应该你永远也得不到结果的

heqichang | 园豆:275 (菜鸟二级) | 2012-05-10 16:29

高手犀利呀!你说的是对的,这样改才是正确的。

for(j=1; j<tmp; j++)

否则:
当j==tmp的时候,
29              if((tmp%j)==0)
是成立的。那么
32                  s-=j;
s就会少于0,这样一来,直接导致下面的:
38          if(s==0)
不成立,那么也就得不到结果。

高手指正,多谢!
 
 
支持(0) 反对(0) zhengmian | 园豆:192 (初学一级) | 2012-05-10 18:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册