c语言问题;题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程¬
为什么这样intk[10];inti,j,n,s;变成这样inti,j,n,s;intk[10];只是改了一下顺序而已但是结果却少了一个,求大神解答。#include"s...
为什么这样
int k[10];
int i,j,n,s;
变成这样
int i,j,n,s;
int k[10];
只是改了一下顺序而已但是结果却少了一个,求大神解答。
#include "stdio.h"
#include "conio.h"
main()
{
int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i<j;i++)
{
if((j%i)==0)
{
n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;i<n;i++)
printf("%d,",k[i]);
printf("%d\n",k[n]);
}
}
getch();
} 展开
int k[10];
int i,j,n,s;
变成这样
int i,j,n,s;
int k[10];
只是改了一下顺序而已但是结果却少了一个,求大神解答。
#include "stdio.h"
#include "conio.h"
main()
{
int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i<j;i++)
{
if((j%i)==0)
{
n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;i<n;i++)
printf("%d,",k[i]);
printf("%d\n",k[n]);
}
}
getch();
} 展开
展开全部
表面看这种事情是“绝对”不会发生的,但这里确实发生了,那只能说明代码有其他漏洞,绝非只是int k[10];和 int i,j,n,s;的先后次序问题;因为没有关联的变量的声明次序是不敏感的。你把int k[10];改成int k[500];试试,我想不会再有你说的问题了。然后自己琢磨原因,琢磨不出来我再回答你……(估计int k[100];也可以)!
追问
int k[100];是可以的,但我不明白的是int k[10];时在 int i,j,n,s;前面定义时结果正确,跑到 int i,j,n,s;后面了缺少了结果,这是什么原因?
追答
代码的问题在于k太小,当j达到100多时就会有10个以上的因子,那么数组k就越界了,这样会产生难以预料的结果。要明白,变量声明时是写在前面的在高地址,写在后面的在低地址。以你的代码为例,当int k[10];在前面时,可以这样安排:k(0013FF58)、i(0013FF54)、j(0013FF50)、n(0013FF4C)、s(0013FF48),这样的话尽管K会越界,但数组的k[0]在低字节向上依次安排,那些越界的数由于没有被“别人”修改,所以你在这种“运气”下仍然能得到正确结果。而反过来写就可能这样安排了:k(0013FF48)、i(0013FF7C)、j(0013FF78)、n(0013FF74)、s(0013FF70),你看,如果越界,首当其冲的就把s的值改写了,再越界就要改写n……等等,你的代码还怎么能正确运行?原因就是只给K留了10个位子,却要定稿多于10个的数,非法修改了后面的i、j……等变量了!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询