一个C语言问题,困惑中,高分求高手解答

今天帮同学看一个题目的时候发现一个这样的状况

题目
已知24有8个因子,而24正好被8整除。求[100,300]之间所有能被其因子的个数整除的整数中最大的数。

他写的源码
#include<stdio.h>
void main()
{ int i,j,s=0;
for(i=300;i>=100;i--)
{
for(j=1;j<=i;j++)
{if(i%j==0)s++;}
if(i%s==0)break;
}
printf("%d\n",i);
}

输出99

经过我检查
我认为正确答案应该是296
把上面代码中的for(j=1;j<=i;j++)改为for(j=1;j<i;j++)后
得到正确答案

但是在我向他解释原因的时候 我加了一点和j变量无关的东西
程序变为
#include<stdio.h>
void main()
{ int r,i,j,s=0,jj[99];
for(r=0;r<100;r++)
{ jj[r]=r+1;
printf("%3d",jj[r]);}
for(i=300;i>=100;i--)
{
for(j=1;j<i;j++)
{
if(i%j==0)
s+=1;
}
if(i%s==0)
break;
}
printf("\n%d\n",i);
}

此时程序输出
数字1~100 (懒得打了)
99

所以问题很奇怪
我前面的 for(r=0;r<100;r++)
{ jj[r]=r+1;
printf("%3d",jj[r]);}
并没有引用j 或者i ,都是无关的东西
然而为什么会导致后面的答案出错?
而我将这段删除后,输出的确是正确的296?

求高手解答

#include<stdio.h>
void main()
{
int i,j,s=0;
for(i=300;i>=100;i--)
{
s=0;//因为s是为了记录每个i的因子数的,所以对于每个i都要清零。只要在这里一把s清一下零就可以了
for(j=1;j<=i;j++)
{
if(i%j==0) s++;
}
if(i%s==0) break;
}
printf("%d\n",i);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-27
99是不对的,不能被8整除哦。仔细检查,肯定有问题哦,输出那一条,printf(“%3d,JJ[r]),这一句错了,自己循环的语句,内部嵌套输出指令,很容易出错,建议把printf移到循环外面哦。
第2个回答  2010-06-27
s初始化的的地方不对把,应该把s=0写在第一层循环里面!
相似回答