cpython3


私信TA

用户名:smartZhou

访问量:71668

签 名:

等  级
排  名 36
经  验 12939
参赛次数 1
文章发表 99
年  龄 0
在职情况 学生
学  校
专  业 计算机科学与技术

  自我简介:

TA的其他文章

题目描述:

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,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();      //一定要清空容器
	}
}


 

0.0分

8 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

#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;
}
2019-10-10 20:58:42
这个才是C++版的题解,赞
啥时候来个C语言动态数组的啊。
2019-09-02 15:58:53
  • «
  • 1
  • »