原题链接:[编程入门]完数的判断
解题思路:
使用两层循环,外循环寻找完数,内循环寻找因子
细节上为了避免输出因子时仍要循环寻找因子,引入数组来储存因子,并用指针的移动来控制数组的读写
但是非完数也会有储存因子的过程,所以代码写得少了,但运行速度并不算快
主要是不希望做重复的过程和定义太多变量,容易搞乱
参考代码:
#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);                    //输入n
    for (int i = 6; i <= n; i++)        //for循环从第一个完数6开始
    {
        // if (i % 10 != 6 && i % 10 != 8)      continue;   //减少运行时间可加入此行,跳过个位非6与8的数
        int s[100] = {0};               //初始化数组s全为0,循环内的临时数组每次循环都会初始化
        int *p = s;                     //通过指针p的移动来控制数组的读写
        for (int j = 1; j <= i / 2; j++)
        {
            if (i % j == 0)
            {
                *++p = j;               //此处p先后移,再赋值储存因子j
                s[0] += j;              //s[0]储存因子的和
            }
        }
        if (s[0] == i)                  //s[0]==i 则 i 为完数
        {
            printf("%d its factors are", i);
            for (p = &s[1]; *p != 0; p++)   //for循环p指向s[1],值为0时停止,每次循环后移一次
            {
                printf(" %d", *p);
            }
            putchar('\n');
        }
    }
    return 0;
}0.0分
28 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
 
int main() { int N; scanf("%d", &N); for (int i = 6; i <= N; i++) { int sum = 0; //此步至关重要,每次内层循环结束后将sum清零 for (int j = 1; j <= i-1; j++) { if (i % j == 0) sum += j; } if (sum == i) { printf("%d its factors are ", i); for (int j = 1; j <= i-1; j++) { if (i % j == 0) printf("%d ", j); } printf("\n"); } } return 0; }#include <stdio.h> int main() { int n,m=0; scanf("%d", &n); for (int i = 6; i <= n; i++) { int s[100] = { 0 }; for (int j = 1; j <= i / 2; j++) { if (i % j == 0) { s[++m] = j; s[0] += j; } } if (s[0] == i) { printf("%d its factors are", i); for (m=1;s[m] != 0; m++) { printf(" %d", s[m]); } putchar('\n'); }#include<stdio.h> #include<math.h> int main() { int n; scanf("%d", &n); for (int i = 6; i < n; i++) { int sum = 0, count = 0,a[1001],t=1; for (int j = 1; j < i; j++) { if (i % j == 0) { a[t] = j; sum += j; t++; count++;//数组个数 } if (sum == i&&i==j+1) { printf("%d its factors are ", i); for (int z = 1; z <=count ; z++) { printf("%d ", a[z]); } printf("\n"); break; } } } }#include<stdio.h> int main() { int N; scanf("%d",&N); int m; for(m=6;m<=N;m++) { if (m % 10 != 6 && m% 10 != 8) continue; int n[100]={0}; int *h=n,p; for(p=1;p<=m/2;p++) { if(m%p==0) n[0]=p+n[0]; *++h=p; } if(n[0]==m) {printf("%d its factors are ",m); for(h=&n[1];*h!=0;h++) { printf("%d ",*h); } putchar('\n'); } } return 0; } 运行错误,咋回事啊#include<stdio.h> int main() { int n,a,i,r; scanf("%d",&n); for(a=1;a<=n;a++) { int sum=0,b[1000]={0},j=0; for(i=1;i<a;i++) { r=a%i; if(r==0) { b[j]=i; j++; } } for(i=0;i<j;i++) { sum+=b[i]; } if(a==sum) { printf("%d ",a); printf("its factors are "); for(i=0;i<j;i++) { printf("%d ",b[i]); } printf("\n"); } } return 0; }int main() { int n,i, j,a = 0; scanf("%d", &n); for ( i = 1; i < n; i++) { for ( j = 1; j < i; j++) { if (i%j == 0)a = a + j; } if (a==i) { printf("%d its factors are ", i); for ( j = 1; j < i; j++) { if (i%j == 0)printf("%d ", j); } printf("\n"); } a = 0; } return 0; }