题目描述
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
输入格式
N
输出格式
? its factors are ? ? ?
样例输入
1000
样例输出
6 its factors are 1 2 3 28 its factors are 1 2 4 7 14 496 its factors are 1 2 4 8 16 31 62 124 248
代码解析
-
包含标准输入输出库:
#include <stdio.h>
这一行代码是预处理指令,它告诉编译器在实际编译之前包含标准输入输出库(stdio.h)。这个库提供了进行输入输出操作的功能,比如printf
和scanf
函数。#include <stdio.h>
-
定义主函数:
int main(void)
是C程序的入口点,void
表示这个函数不接受任何参数。int main(void)
-
定义变量:
int N
:用于存储用户输入的自然数N。int arr[1000]
:定义了一个数组,用于存储一个整数的所有因子,数组大小为1000,假设输入的N不会超过1000的因子数量。int k
:用于记录找到的因子数量。int sum
:用于计算因子之和。int i
和int j
:用于在循环中作为计数变量。int N; int arr[1000]; int k; int sum;
-
输入N的值:
scanf("%d", &N);
这个函数调用用于从标准输入(通常是键盘)读取一个整数N。scanf("%d", &N);
-
找出所有整数的因子:
- 进入一个外部
for
循环,循环变量i
从2开始,直到N
。- 在每次外部循环中,初始化
k
为0和sum
为0,分别用于记录因子数量和计算因子之和。 - 进入一个内部
for
循环,循环变量j
从1开始,直到i-1
。- 在每次内部循环中,检查
i
是否能被j
整除(i % j == 0
),如果能,则j
是i
的一个因子。 - 将找到的因子
j
存储在数组arr
中,并将k
加1。 - 将
j
加到sum
上,累加因子之和。
- 在每次内部循环中,检查
- 循环结束后,检查
sum
是否等于i
,如果是,则i
是一个其因子之和等于自身的数。scanf("%d", &N); for (int i = 2; i <= N; i++) { k = 0; sum = 0; for (int j = 1; j < i; j++) { if (i % j == 0) { arr[k] = j; k++; sum += j; } } }
- 在每次外部循环中,初始化
- 进入一个外部
-
输出结果:
- 如果
sum
等于i
,那么首先使用printf("%d its factors are ", i);
输出当前的整数i
和提示信息“its factors are”。 - 然后使用另一个
for
循环,循环变量i
从0开始,直到k-1
,输出数组arr
中存储的所有因子。 - 最后输出一个换行符,以分隔输出结果。
if (sum == i) { printf("%d its factors are ", i); for (int i = 0; i < k; i++) { printf("%d ", arr[i]); } printf("\n"); }
- 如果
-
函数返回:
return 0;
表示main
函数执行成功并返回0。在C语言中,main
函数的返回值通常用于表示程序的退出状态,其中0表示成功。return 0;
源代码
#include <stdio.h>
int main(void)
{
int N;
int arr[1000];
int k;
int sum;
scanf("%d", &N);
for (int i = 2; i <= N; i++)
{
k = 0;
sum = 0;
for (int j = 1; j < i; j++)
{
if (i % j == 0)
{
arr[k] = j;
k++;
sum += j;
}
}
if (sum == i)
{
printf("%d its factors are ", i);
for (int i = 0; i < k; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
}
return 0;
}