zoukankan      html  css  js  c++  java
  • 习题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 */
  • 相关阅读:
    Oracle EBS 自治事务
    [转]Oracle GoldenGate安装配置
    [Oracle EBS R12]SQL Queries and Multi-Org Architecture in Release 12 (Doc ID 462383.1)
    LUN 和 LVM 知识
    [RAC] oracle rac 后台进程
    Manually connecting to the Oracle Linux Yum Server
    [转]ORACLE 绑定变量用法总结
    [转]分析函数计算移动平均的测试
    并发与多版本:update重启动问题
    WCF(二)三种通信模式
  • 原文地址:https://www.cnblogs.com/samgue/p/13196796.html
Copyright © 2011-2022 走看看