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

本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<mn10000)之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如: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 i, m, n;

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

    return 0;
}

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

输入样例1:

1 30
 

输出样例1:

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

输入样例2:

7 25
 

输出样例2:

No perfect number


  1 /*思路:
  2 结果包括:
  3 1.一个也没有输出No;
  4 2.只输出1;
  5 3.输出一系列完数
  6 其中产生第一种结果的情况包括:
  7 (1)m==n&&m不是完数;
  8 (2)m!=n&&区间中没有完数。
  9 产生第二种结果的情况包括:
 10 (1)m==n&&m==1;
 11 (2)m!=n&&m==1&&(m,n]的区间中没有完数;
 12 产生第三种结果的情况为:
 13 m!=n&&[m,n]的区间中有完数,m可以是1.
 14 
 15 由以上三种情况分析可以得到:
 16 (1)m==n&&m==1直接输出sum值为1,并输出“1 = 1”;
 17 (2)(m==n&&m==1)||(m==n&&m!=1)||(m!=n&&m==1)||(m!=n&&m!=1)
 18 都依次遍历,有完数则直接输出(包括1),无完数则输出No;
 19 
 20 因此对两个函数进行分工:
 21 factorsum()函数用于计算sum值;
 22 PrintFN()函数用于遍历输出:sum==0,说明无,输出No;sum!=0,依次输出。
 23 
 24 其中在这里数字本身不能是它自己的因子,
 25 所以对于一个数字m,对它进行遍历时,它的遍历范围为[1,m),
 26 那么m=1时此遍历无法进行,因此将m=1单独计算直接输出sum值。
 27 */
 28 
 29 int factorsum(int number){
 30     //因子和sum
 31     int sum=0;
 32     //从1到number依次遍历,余数为0则是因子,加入sum中计算总和
 33     if(number==1){
 34         return 1;
 35     }
 36     else{
 37         for(int i=1;i<number;i++){
 38             if(number%i==0){
 39                 sum+=i;
 40             }
 41         }
 42     }
 43     //最后输出sum
 44     return sum;
 45 }
 46 
 47 void PrintPN(int m,int n){
 48     int num=0;
 49     for(int j=m;j<=n;j++){
 50     //依次遍历符合factorsum()函数条件的数字,并计算数目
 51         if(factorsum(j)==j){
 52             //如果该值符合则首先输入该值,以及第一个因子1
 53             printf("%d = 1",j);
 54             //依次遍历符合整除条件的数字,输出因子
 55             for(int k=2;k<j;k++){
 56                 if(j%k==0){
 57                     printf(" + %d",k);
 58                 }  
 59             }
 60             //该值因子遍历完成,换行,计数加一
 61             printf("
");
 62             num++;
 63         }
 64     }
 65     if(num==0){
 66         printf("No perfect number
");
 67     }
 68 }
 69 
 70 /*
 71 
 72 https://blog.csdn.net/dreampinguo/article/details/81092212
 73 
 74 int factorsum(int number)
 75 {
 76     int sum = 0;
 77     int i;
 78     if (number == 1)
 79     {
 80         return 1;
 81     }
 82     else
 83     {
 84         for (i = 1; i < number; i++)
 85         {
 86             if (number % i == 0)
 87             {
 88                 sum += i;
 89             }
 90         }
 91     }
 92     return sum;
 93 }
 94  
 95 void PrintPN(int m, int n)
 96 {
 97     int i, j;
 98     int count = 0;
 99     for (i = m; i <= n; i++)
100     {
101         if ((factorsum(i) == i))
102         {
103             printf("%d = 1", i);
104             for (j = 2; j <= i / 2; j++)
105             {
106                 if (i % j == 0)
107                 {
108                     printf(" + %d", j);
109                 }
110             } 
111             printf("
");
112             count++;
113         }
114     }
115     if (count == 0)
116     {
117         printf("No perfect number
");
118     }
119 }
120 */
原文地址:https://www.cnblogs.com/samgue/p/13196796.html