【问题描述】一个数如果恰好等于它的因子之和,这个数就成为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序打印出1000之内(包括1000)所有的完数,并按如下格式输出其所有因子:
6 its factors are 1,2,3.
【输入形式】无输入
【输出形式】输出1000以内所有的完数及其因子,每行输出一个完数及其因子。
6 its factors are 1,2,3.
【提示】完数不止一个哦!而且最后一个数后面的结束标点符号是英文状态的句号。
1.完整代码:
int main()
{
int x;
int i;
int sum;
int m = 0;
int n = 0;
for (x = 2; x <= 1000; x++)
{
sum = 1;
m = 0;
for (i = 2; i <= x / 2; i++)
{
if (x % i == 0)
{
sum += i;
m++;
}
}
if (sum == x)
{
n = 0;
printf("%d its factors are 1,",x);
for (i = 2; i <=x/2; i++)
{
if (x % i == 0)
{
n++;
if (n<m)
{
printf("%d,", i);
}
else
{
printf("%d.", i);
//printf(".");
}
}
}
printf("\n");
}
}
return 0;
}
2.算法思路及代码分析:
(1)首先找出1000以内的完数,那么我们需要遍历1000以内的所有数字:那么我们可以利用for循环进行遍历;那么最外层的循环我们就进行1000以内(包含1000)的数字的循环;
for (x = 2; x <= 1000; x++)
(2)其次:我们需要找出每个数的具体的因子:那么我们再次利用for循环进行因子的遍历;
for (i = 2; i <= x / 2; i++)
在这里:为什么使用x/2呢?
原因:因子一定要能够整除,当因子大于x的1/2时,其商一定只能商1,那么一定会由余数,肯定不是它的因子,所以我们只需要遍历1/2的x即可找出所有的因子;
将所有的因子累加与x进行比较,如果相等,那么该数字就是完数;
那么我们需要按要求进行打印:
因为1一定是数字的因子,所以我们直接将其打印出来即可;
printf("%d its factors are 1,",x);
(3)题目要求:6 its factors are 1,2,3.
即数字之间以逗号隔开,而末尾以句号结尾
所以我们需要判断因子是否打印到最后一个因子,所以在这里,设置m,n两个变量,用来辅助判断
用m来汇总因子个数,当n<m时,我们一直以逗号结尾打印;
在这里有两点需要注意:1.m要及时清零,每进行一个完数的判断,我们都需要将m清零,这样才能准确的总结出因子的个数;2.n要及时清零,每进行一个完数的因子的打印,也要将n清零,以便将n下次从0开始++,与m进行比较!
if (sum == x)
{
n = 0;
printf("%d its factors are 1,",x);
for (i = 2; i <=x/2; i++)
{
if (x % i == 0)
{
n++;
if (n<m)
{
printf("%d,", i);
}
else
{
printf("%d.", i);
//printf(".");
}
}
}
printf("\n");
最终结果:
总结:利用循环嵌套,寻找完数!
打印的时候也要注意格式,选择合适地方法进行打印!!!
(如果有更好的方法,欢迎在评论区交流,感谢!!!)