1 条题解

  • 0
    @ 2025-5-3 22:12:04

    分析:

    程序的主要思路是不断读取输入的整数,对于每个输入的整数,计算它所有因数(除自身外)的和,然后根据因数和与该整数本身的大小关系,将其分类为亏数、完全数或盈数,并输出相应的结果。当输入为 0 时结束输入过程,最后输出结束标记。

    解题原理

    1.因数计算:通过循环从 1 到该数的平方根(i*i<=n)来寻找因数。如果 n 能被 i 整除且 n/i 不等于 i,那么 i 和 n/i 都是 n 的因数,将它们加到因数和 sum 中;如果 n 能被 i 整除且 n/i 等于 i,说明 i 是 n 的平方根,只将 i 加到因数和 sum 中。

    2.数的分类判断:计算完因数和 sum 后,将 sum 减去该数本身(因为在计算因数和时包含了该数本身,需要减去)。然后比较 sum 和该数本身的大小关系:如果 sum 小于该数,那么该数是亏数;如果 sum 等于该数,那么该数是完全数;如果 sum 大于该数,那么该数是盈数。

    实现步骤

    1.输入处理:使用 while 循环不断读取输入的整数 n,将非零的整数存储到数组 num 中,并记录输入的整数个数 count,当输入为 0 时停止输入。

    2.输出标题:输出 PERFECTION OUTPUT 作为结果输出的标题。

    3.数的分类判断与输出:遍历数组 num,对每个存储的整数调用 trans 函数,在 trans 函数中计算因数和并根据大小关系输出该数是亏数、完全数还是盈数的判断结果。

    4.输出结束标记:输出 END OF OUTPUT 作为整个程序输出的结束标记。

    c++代码:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    void trans(int n){
        int sum=0;
        for(int i=1;i*i<=n;i++){    //计算因子和
                if(n%i==0 && n/i!=i){
                    sum+=(i+n/i);
                }   
                if(n%i==0 && n/i== i){
                    sum+=i;
                }   
        }
        sum-=n;
        if(sum<n)  cout<<setw(5)<<n<<"  DEFICIENT"<<endl;
        if(sum==n) cout<<setw(5)<<n<<"  PERFECT"<<endl;
        if(sum>n)  cout<<setw(5)<<n<<"  ABUNDANT"<<endl;
    }
    int main()
    {   int n,count=0,num[100];
        while(cin>>n && n){
            num[count] = n;
            count++;
        }
        cout<<"PERFECTION OUTPUT"<<endl;
        for(int i=0;i<count;i++){
            trans(num[i]);
        }
        cout<<"END OF OUTPUT"<<endl;
        return 0;
    }
    
    • 1

    信息

    ID
    529
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者