C语言题目:完数判断并输出

题目描述

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,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 

代码解析

  1. 包含标准输入输出库: #include <stdio.h> 这一行代码是预处理指令,它告诉编译器在实际编译之前包含标准输入输出库(stdio.h)。这个库提供了进行输入输出操作的功能,比如printfscanf函数。

    #include <stdio.h>

  2. 定义主函数: int main(void) 是C程序的入口点,void表示这个函数不接受任何参数。

    int main(void)

  3. 定义变量:

    • int N:用于存储用户输入的自然数N。
    • int arr[1000]:定义了一个数组,用于存储一个整数的所有因子,数组大小为1000,假设输入的N不会超过1000的因子数量。
    • int k:用于记录找到的因子数量。
    • int sum:用于计算因子之和。
    • int iint j:用于在循环中作为计数变量。
      	int N;
      	int arr[1000];
      	int k;
      	int sum;

  4. 输入N的值: scanf("%d", &N); 这个函数调用用于从标准输入(通常是键盘)读取一个整数N。

    	scanf("%d", &N);
    

  5. 找出所有整数的因子:

    • 进入一个外部for循环,循环变量i从2开始,直到N
      • 在每次外部循环中,初始化k为0和sum为0,分别用于记录因子数量和计算因子之和。
      • 进入一个内部for循环,循环变量j从1开始,直到i-1
        • 在每次内部循环中,检查i是否能被j整除(i % j == 0),如果能,则ji的一个因子。
        • 将找到的因子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;
        			}
        		}
        	}

  6. 输出结果:

    • 如果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");
      		}
      		

  7. 函数返回: 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;
}

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值