解题思路:

使用两层循环,外循环寻找完数,内循环寻找因子

细节上为了避免输出因子时仍要循环寻找因子,引入数组来储存因子,并用指针的移动来控制数组的读写

但是非完数也会有储存因子的过程,所以代码写得少了,但运行速度并不算快

主要是不希望做重复的过程和定义太多变量,容易搞乱



参考代码:

#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.0分

28 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 18 条评论

独上兰舟 2年前 回复TA
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;
}
起岸希 2年前 回复TA
@起岸希 看我这个,其实不用指针的
起岸希 2年前 回复TA
#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');
        }
cxz 2年前 回复TA
#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;
			}
		}
	}
}
北极星 3年前 回复TA
#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;
}



运行错误,咋回事啊
Carbon14 3年前 回复TA
@tqtql 我写的与你类似,但是我在<处用的是<=,为什么就不成功了……
十幺 3年前 回复TA
耗时已经比我少了  我是用数组下标找因子的    指针还没学明白,不会用
jjjjc 3年前 回复TA
#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;
}
tqtql 3年前 回复TA
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;
}
CodeRookie 3年前 回复TA
@bobo 发现评论不能换行,我私信发你吧