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();
}
展开
 我来答
White_MouseYBZ
2013-08-03 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6667万
展开全部
表面看这种事情是“绝对”不会发生的,但这里确实发生了,那只能说明代码有其他漏洞,绝非只是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……等变量了!
jk1194144043
2013-08-03 · TA获得超过397个赞
知道小有建树答主
回答量:373
采纳率:100%
帮助的人:157万
展开全部

没有少啊,是6 ,28,496。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-03
展开全部
你定义的k[10]太小了,中间有的数的因子个数大于10个,此时数据就会溢出,导致结果异常。
定义长一些就可以了,保证存储因子时不会溢出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式