题目描述:
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,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
数据测试:
本人进行了三组测试:
解题思路:
何为因子?最通俗说,如果说j是i的因子,那么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 人评分
#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; }
这个才是C++版的题解,赞 啥时候来个C语言动态数组的啊。
z能 2019-10-10 20:57:56 |
#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); }
C语言程序设计教程(第三版)课后习题8.9 (C语言代码) 用函数传参的方法浏览:4064 |
【回文数(二)】 (C语言代码)浏览:851 |
C语言程序设计教程(第三版)课后习题9.2 (Java代码)浏览:608 |
【亲和数】 (C语言代码)浏览:855 |
计算质因子 (C++代码)浏览:1617 |
【偶数求和】 (C语言代码)浏览:639 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:1195 |
WU-整数平均值 (C++代码)浏览:1237 |
2004年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:1327 |
Hello, world! (C语言代码)浏览:822 |