题目描述:

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子

输入

N

输出

? its factors are ? ? ?

样例输入

1000

样例输出

6 its factors are 1 2 3
28 its factors are 1 2 4 7 14
496 its factors are 1 2 4 8 16 31 62 124 248

编译环境:

Ubtun Debain Linux g++

Windows 

数据测试:

本人进行了三组测试:

QQ图片20190102183217.jpg

解题思路:
何为因子?最通俗说,如果说ji的因子,那么i%j==0(整除) 又因为题目中完数的定义:

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。

那么 j的范围就是1~i-1 .

对于本题,我定义了一个Vector容器来存储所有的因子(注意Vector类似于C/C++中的动态数组)

求1-N之间所有的完数。

我使用了双层循环,第一层循环i 取 [1~N] 遍历1到N之间所有的数。

第二层循环j表示的是因子。由于因子不能取到本身i,j 应该取1到i-1之间,即j取[1,i)

如果是因子,那么就把因子放入容器中(可以理解为存入数组)

并把所以因子累乘,如果累乘的结果sum和数本身i相等,那么就是完数!

注意事项:
注意数据输出格式!!!

如果有C语言同学看不懂,可以在下方评论,我可以将下列代码转换成C语言形式!!!

定义迭代器:

vector<变量类型>::iterator  变量名

例如:

vector<int>::iterator iter;


注意每个数判断完之后,一定要清空容器vec.clear()。

比如说6这个数。不含本身的因子有1 2 3,全部存入vec。

那么vec[0]=1 vec[1]=2  vec[3]=3

如果不清空vec这个容器,再次循环时,i 取到7。7有因子1,那么 1将继续存入上次的vec容器中,

vec[4]=1。 

导致原本7的所有因子之和为1 变成了1+2+3+1。

所以一定要清空容器。

参考代码:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int N,sum;
	vector<int> vec;
	cin>>N;
	for(int i=1; i<=N; i++)         //遍历1~N之间所有数
	{
		sum=0;
		for(int j=1; j<i; j++)  //j是因子 范围取1~i-1  
		{
			if(i%j==0)      //如果j是因子
 			{ 
				vec.push_back(j);  //存入容器
				sum+=j;            //是因子就把因子累加
			}
		}
		if(sum==i) //所有因子之和sum和数本身i相等,则是完数!
		{
			cout<<i<<" its factors are ";
			for(vector<int>::iterator iter=vec.begin(); iter!=vec.end(); iter++)
			{
				cout<<*iter<<" "; 
			}
			cout<<endl;
		}
		vec.clear();      //一定要清空容器
	}
}


点赞(3)
 

0.0分

9 人评分

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

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

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

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

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

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

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

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

评论列表 共有 3 条评论

z能 5年前 回复TA
#include<iostream>
int main()
{
	int i,j,sum=0,k,m,n,a[100];
	std::cin>>n;
	for(i=1;i<=n;i++)
	{
		k=0;sum=0;
		for(j=1;j<=i/2;j++) 
	      if(i%j==0)
		   a[k++]=j;
		  
		for(m=0;m<k;m++)
		sum+=a[m];
		if(sum==i)
	    {
	    	std::cout<<i<<" "<<"its factors are ";
		    for(m=0;m<k;m++)
		    std::cout<<a[m]<<" ";
		    std::cout<<std::endl;
		}
	}
	
	return 0;
}
z能 5年前 回复TA
@神鬼一刀流 #include <stdio.h>   int main() {     long double    N, sum = 0;     int        factor[100], x = 0;       scanf( "%Lf", &N );       for ( int i = 6; i <= N; i++ )     {         if ( i % 10 == 6 || i % 10 == 8 )         {             for ( int j = 1; j <= i / 2; j++ )               {                 if ( i % j == 0 )                 {                     factor[x] = j;                     x++;                     sum = sum + j;                 }             }               if ( sum == i )             {                 printf( "%d its factors are ", i );                   for ( int k = 0; k < x; k++ )                 {                     printf( "%d ", factor[k] );                 }                 printf( "\n" );             }               sum    = 0;             x    = 0;         }     }       return(0); }
神鬼一刀流 5年前 回复TA
这个才是C++版的题解,赞
啥时候来个C语言动态数组的啊。