习题6-3 使用函数输出指定范围内的完数 (20 point(s))

本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。

函数接口定义:

int factorsum( int number );
void PrintPN( int m, int n );

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[m, n]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

裁判测试程序样例:

#include <stdio.h>

int factorsum( int number );
void PrintPN( int m, int n );

int main()
{
    
    
    int m, n;

    scanf("%d %d", &m, &n);
    if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
    if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
    PrintPN(m, n);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

6 30

输出样例1:

6 is a perfect number
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

输入样例2:

7 25

输出样例2:

No perfect number

题解:

int factorsum( int number )
{
    
     //完数就是该数恰好等于除自身外的因子之和
	int sum = 1; //定义sum为该数因子之和(由于1是每个数都有的因子,所以直接sum等一1)
	int i; //循环变量 同时也是因子
	for (i = 2; i < number; i++) //循环从2到number减一(每个数的因子都有1)
	{
    
    
		if (number % i == 0) sum += i; //如果能被2整除就是因子,累加y起来
	}
	return sum;
}
void PrintPN( int m, int n )
{
    
    
	int flag = 0; //中介(如果有完数赋值为1,如果没有就是0)
	int i, s; //循环变量 (同时i表示区间的每个数,s表示因子)
	for (i = m;i <= n; i++) //区间循环
	{
    
    
		if (factorsum(i) == i) //如果调用上面的函数的求因子的和等于我们现在的数i,那么i就是完数
		{
    
     //如果 一个数的因子之和 等于这个数 那么该数就是完数 
			flag = 1; //有完数 flag赋值为1
			printf("%d = 1", i); //由于每一个数都有因子1,所系先打印出来
			for (s = 2; s < i; s++) //找因子
			{
    
    
				if (i % s == 0) printf(" + %d",s); //打印因子(格式需要找规律)
			}
			printf("\n"); //打印完一个完数需换行
		}
	}
	if (flag == 0) printf("No perfect number"); //如果没有完数,打印相应信息
}

------------------------------另一种写法--------------------------------------------------------

// int factorsum( int number )
// { //完数就是该数恰好等于除自身外的因子之和
// 	int sum = 1; //定义sum为该数因子之和(由于1是每个数都有的因子,所以直接sum等一1)
// 	int i; //循环变量 同时也是因子
// 	for (i = 2; i < number; i++) //循环从2到number减一(每个数的因子都有1)
// 	{
    
    
// 		if (number % i == 0) sum += i; //如果能被2整除就是因子,累加y起来
// 	}
// 	return sum;
// }
// void PrintPN( int m, int n )
// {
    
    
// 	int i, s; //循环变量(同时i表示区间的每个数,s表示因子) 
// 	int cnt = 0; //中介,同时也表计数器,如果大于0就表示有完数 
// 	for (i = m; i <= n; i++) //区间循环
// 	{
    
    
// 		int sum = 1; //一个数的因子之和 
// 		for (s = 2; s < i; s++) //循环求一个数的因子之和 
// 		{
    
    
// 			if (i % s == 0) sum+=s;
// 		}
// 		if (sum == i) //如果 一个数的因子之和 等于这个数 那么该数就是完数 
// 		{
    
    
// 			cnt++; //计数器加一 
// 			printf("%d = 1", i); //由于每一个数都有因子1,所系先打印出来
// 			for (s = 2; s < i; s++) //找因子
// 			{ //6 = 1 + 2 + 3
// 				if (i % s == 0) printf(" + %d", s); //打印因子(格式需要找规律)
// 			}
// 			printf("\n"); //打印完一个完数需换行
// 		}
// 	}
// 	if (cnt == 0) printf("No perfect number"); //如果没有完数,打印相应信息
// } 

猜你喜欢

转载自blog.csdn.net/qq_44715943/article/details/114584769