求1000以内的所有完数,代码如下:
int main()
{
int k[10] = {0};
int i,j,n,s;
for(j=2; j<1000; j++)
{
s = j;
n = -1;
for(i=1; i<j; i++)
{
if((j%i) == 0)//除尽说明i是j的因子之一
{
n++;
s = s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is WanShu:\n", j);
for(int i=0;i<=n; i++)
printf("%d,",k[i]);
printf("\n");
}
}
return 0;
}
结果为:
6 is WanShu:
1,2,3,
28 is WanShu:
1,2,4,7,14,
当我把代码中的数组k[10]改为k[20],长度变为20时,结果就为:
6 is WanShu:
1,2,3,
28 is WanShu:
1,2,4,7,14,
496 is WanShu:
1,2,4,8,16,31,62,124,248,
这是什么原因呢?
#include<stdio.h>//头文件
int main()//主函数
{
int number,s,i;//定义变量
for(number=2;number<1000;number++)//for循环
{
//直接从2开始
s=0;
for(i=1;i<number;i++)
{
//检查i是否是m的因子
if((number%i)==0)
{
//如果是的话
s=s+i;
}
}
if(s==number)
{
printf("%d的因子为:",number);
for(i=1;i<number;i++)
{
if(number%i==0)
{
//判断是否是因子,是的话就输出
printf("%d ",i);
}
}
printf("\n");//换行
}
}
return 0;//主函数返回值为0
}
结果:
6的因子为:1 2 3
28的因子为:1 2 4 7 14
496的因子为:1 2 4 8 16 31 62 124 248
我打印了一下你n的值,结果意料之中,n的索引越界了,但是貌似你的编译器有问题,索引越界也不报错,k[40]才不会导致索引越界,结果如下,
程序按理说是会崩溃的,在打印完毕之后。
你可以在给k[n]赋值时打印一下n的值,已经溢出了 ,然而k却没有那么多的元素。
使用 vector
#include <stdio.h>
#include <vector>
int main()
{
using std::vector;
int i, j, n, s;
for (j = 2; j < 1000; j++)
{
s = j;
n = -1;
vector <int> k;
for (i = 1; i < j; i++)
{
if ((j%i) == 0)//除尽说明i是j的因子之一
{
n++;
s = s - i;
k.push_back(i);
}
}
if (s == 0)
{
printf("%d is WanShu:\n", j);
for (int i = 0; i < k.size(); i++)
printf("%d,", k[i]);
printf("\n");
}
}
return 0;
}