找出200以内所以完数,并输出其因子

找出200以内所以完数,并输出其因子使用二重循环嵌套,外层循环针对2~200之间的所以数

代码如下:

#include <stdio.h>
int main () {
    for(int i = 2; i <= 200; i++) {
        int arr[200]; // 存放因数
        int k = 0;
        int sum = 0;
        for(int j = 1;j <= i / 2; j++) {
            if (i % j == 0) {
                sum += j;
                arr[k] = j;
                k++;
            }
        }  
        if(sum == i) {
            // 是完数
            printf("%d是一个完数, 它的因数有:", i);
            for(int kk = 0; kk < k; kk++) {
                printf(" %d ", arr[kk]);
            }
            printf("\n");
        }
    }
    return 0;
}  

参考

#include <stdio.h>

int main() {
    for (int i = 2; i <= 200; i++) {
        int sum = 0;
        printf("%d 的因子有: ", i);
        for (int j = 1; j <= i / 2; j++) {
            if (i % j == 0) {
                printf("%d ", j);
                sum += j;
            }
        }
        if (sum == i) {
            printf(",%d 是完数\n", i);
        } else {
            printf("\n");
        }
    }
    return 0;
}

外层循环中,遍历2到200之间所有的整数。对于每个整数,通过内层循环查找其因子,并将这些因子加起来。如果总和等于该整数本身,则它就是一个完数。程序输出该整数及其因子,如果该整数为完数,则输出“是完数”,否则只输出换行符。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7517831
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:4.9给一个不多于5位的正整数,要求: (1)求出它是几位数 (2)分别输出每一位数字; (3)按逆序输出各位数字,例如原数为321,应输出123.
  • 除此之外, 这篇博客: C语言经典100例精选中的 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include<stdio.h>
    
    int main() {
        int i = 0;  //循环次数
        int j = 1;  //假设第五只猴子分的桃子数。(1-255,当为255时满足条件)
        int n;      
        while(i < 5) {               //i记录逆推次数,达到5说明for循环执行了5次,找到了满足条件的最小数
            n = 4 * j;               //n初值为最后剩下的桃子数,然后从n=4,8···寻找满足条件的数
            for(i = 0; i < 5; i++) {
                if(n % 4 != 0)       //后面四只猴子分之前的桃子数必须是四的倍数,因为是前一只猴子剩下的,不满足则退出循环
                    break;
                n = n / 4 * 5 + 1;   //一次求第5只猴子分桃子前的桃子数,判断是否是4的倍数
                printf("第五只猴子分得桃子为%d个时,剩余桃子数为%d\n",j,n);
            }
            j++;
        }
        printf("海滩上原来最少有%d个桃子\n", n);
        return 0;
    }
    

    法二:

    #include <stdio.h>
    #include <stdlib.h>
    /*
    A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。
    日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。
    B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。
    C、D、E依次醒来,也按同样的方法拿鱼。
    问他们台伙至少捕了多少条鱼?以及每个人醒来时见到了多少鱼?
    */
    int main(){
        int n;//至少捕了多少条鱼
        int A,B,C,D,E;
        for(n=6;;n++){//这个n是一开始总共鱼的数量,最起码得能分成五份还余1吧
            A=4*(n-1)/5;  //A=(n-1)乘五分之四
            B=4*(A-1)/5;
            C=4*(B-1)/5;
            D=4*(C-1)/5;
            if(n%5==1 && A%5==1 && B%5==1 && C%5==1 && D%5==1){   //平均分成5份多一
                printf("至少合伙捕鱼:%d条\n",n);
                printf("分别见到鱼的条数:%d %d %d %d\n",A,B,C,D);
                break;
            }
        }
        return 0;
    }
    
  • 您还可以看一下 张先凤老师的《计算机体系结构—网络篇3、4》之IP分类与组成、网络标识、子网掩码、私网组建等课程中的 组建私网举例2小节, 巩固相关知识点