2017.11.28

完数VS盈数

题目描述

一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。

输入描述:

题目没有任何输入。

输出描述:

输出2到60之间所有“完数”和“盈数”,并以如下形式输出:
E: e1 e2 e3 ......(ei为完数)
G: g1 g2 g3 ......(gi为盈数)
其中两个数之间要有空格,行尾不加空格。

#include <iostream>  
#include <cstdio>
#include <iomanip>  
#include <string>
#include <cmath>
//用setprecision(n)设置精度,其中n表示精确到小数点后n位  
//解题的关键:
//求出因数,并用一个数组来储存,后面处理
//不足:要用到很多的额外空间
using namespace std;

int main()
{
    int arr[30];
    int arr1[10];
    int arr2[10];
    int index = 0;
    int index1 = 0;
    int index2= 0;
    int sum = 0;
    int num = 2;
    for (int num = 2; num < 61; num++)
    {
        for (int j = 1; j <num; j++)
        {
            if (num%j == 0)
            {                
                arr[index++] = j;
            }
        }
        for (int i = 0; i < index; i++)
        {        
            sum += arr[i];
        }
        if (sum == num)
        {
            arr1[index1++] = num;
        }
        else if (sum>num)
        {
            arr2[index2++] = num;
        }
        index = 0;
        sum = 0;
    }
    cout << "E: ";
    for (int i = 0; i < index1; i++)
    {
        cout << arr1[i] ;
        if (i < index1 - 1)
        {
            cout << ' ';
        }
    }
    cout << endl;
    cout << "G: ";
    for (int i = 0; i < index2; i++)
    {
        cout << arr2[i];
        if (i < index2 - 1)
        {
            cout << ' ';
        }
    }
    return 0;
}

 



posted @ 2017-11-30 18:42  P_langen  阅读(194)  评论(0编辑  收藏  举报