题目描述
求正整数
2
2 和 n 之间的完全数(一行一个数)。
完全数:对于一个自然数,所有比它小的所有因数之和,等于它本身,它就是个完全数。如6=1+2+3。
n(n≤10000)
输出格式
一行一个数,按由小到大的顺序。
请问我这个哪错了?
#include <iostream>
#include <iomanip>
using std::setw;
using namespace std;
int main()
{
int b[0],a[100],ying,sum,he,n;
cin>>b[0];
sum=1;
for(a[0]=2;a[0]>=b[0];a[0]++)
{
for(ying=2;ying>=a[2];ying++)
{
if(a[0]%ying==0)
{
a[sum]=a[0]/ying;
sum++;
}
}
for(a[1]=a[n];a[n]>=100;n++)
{
he=0+a[n];
}
if(he==a[n])
{
cout>>a[n];
}
}
return 0;
}
#include <iostream>
using namespace std;
int main() {
int b, a[100], sum, n;
cin >> b; // 输入上限
for (int i = 4; i <= b; i+=2) { // 从4开始,步进2来检查奇数
sum = 1;
for (int j = 2; j < i; j++) {
if (i % j == 0) { //如果j是i的因子
sum += j; //则将j加到因数和中
}
}
if (sum == i) { //如果因数和等于自己
cout << i << endl; //则是完全数
}
}
return 0;
}
你这逻辑完全都说不通,数组a是干啥的,为什么a[0],a[1],a[2]会写死了
你需要变量就定义变量,不要把数组里的3个值当固定变量用,这可读性太差了
还有,n根本都没赋值,老去访问a[n]是在干啥
你先把思路整理清楚,然后翻译成代码
不要上来先定义个数组,再想方设法的要把数组用上
这题根本没有任何地方需要用到数组
-=-=-=-=
我来给你理一下思路
1.题目要求你输出2到n之间的完数,那么好歹先定义一个n,再用scanf将n的值从控制台输入
连n的值都没有输入,后续在算啥呢
2.定义一个变量i,for循环,从2到n
3.循环里再套个循环,或者定义一个函数,判断i是否是完数,是就printf
4.完数的定义前面已经有了,就跟求一个数是否是质数差不多
求质数是判断是否能被2和i以下的数整除,而求完数是整除了就把j加到sum里面(sum+=j),最后看sum和i是否相等
示例代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 2; i <= n; i++) {
int sum = 1; // 因数之和初始化为1
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
sum += j;
if (j * j != i) {//这是为了节约循环次数,如果j是i的因数那么i/j一定是另一个因数
sum += i / j;
}
}
}
if (sum == i) {
cout << i << endl;
}
}
return 0;
}