习题6-3 使用函数输出指定范围内的完数 (20分)
Posted samgue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题6-3 使用函数输出指定范围内的完数 (20分)相关的知识,希望对你有一定的参考价值。
本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数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 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 */
以上是关于习题6-3 使用函数输出指定范围内的完数 (20分)的主要内容,如果未能解决你的问题,请参考以下文章