求正整数 2 和 n 之间的完全数 数组

题目描述
求正整数
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;
}

  • b[0]是一个越界访问,数组b只有0个元素,访问b[0]是非法的。
  • a数组定义为int a[100],但是你使用a[n] ,当n>=100时也是非法访问。
  • 你没有正确计算一个数所有的因数之和。
  • 输出格式的逻辑也不正确。
#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;
}