zoukankan      html  css  js  c++  java
  • 完数问题

    题目链接

    题目描述

    请写一个程序,给出指定整数范围【a ,b】内所有的完数,一个数如果恰好等于除它本身外的所有因子之和,这个数就称为完数,例如6是完数,因为6=1+2+3。

    输入描述:

    每一组数据为两个正整数,分别表示a和b(1<a<b<10^5)。

    输出描述:

    指定范围内的所有完数,每个数占一行。
    示例1

    输入

    复制
    1 100

    输出

    复制
    6
    28

    说明

    完数问题本身很简单,但是要注意一些问题,否则会引起超时

    一是:应该由于因子两两成对,所以只需要计算到根号n之前,只求其一

    二是:应该先将1~100000之间的所有完数存放到数组中,饭后再在给定区间进行匹配,否则会因为重复计算而超时

    #include<iostream>
    #include<math.h>
    using namespace std;
    //采用此方法运行时间太长
    /*bool isWanshu(int n)
    {
        int sum = 1;
        for(int i = 2;i<=sqrt(n*1.0);i++)
        {
            if(n%i==0)
            {
                sum+=i;
                sum += n/i;
            }
        }
        if(sum == n && n!=1)
            return true;
        else
            return false;
    }*/
    //应先将1-100000之间的完数计算出来,存到数组中
    int wanshu[10] = {0};
    int index = 0;
    void findWanshu()
    {
        int sum;
    
        for(int n=2;n<100000;n++)
        {
            sum = 1;                       //1一定是因子
            for(int i = 2;i<=sqrt(n*1.0);i++)//只需计算到根号n之前
            {
                if(n%i==0)
                {
                    sum+=i;
                    sum += n/i;
                 }
            }
            if(sum==n)             //是完数则存入数组
            {
                wanshu[index] = n;
                index++;
            }
        }
    }
    int main()
    {
        findWanshu();
        int a = 0;
        int b = 0;
        while(cin>>a>>b)
        {
            for(int j = 0;j<index;j++)
            {
                if(wanshu[j]>=a && wanshu[j]<=b)
                    cout<<wanshu[j]<<endl;
            }
        }
        return 0;
    }

    也可以采用打表的方法

  • 相关阅读:
    Linux下C程序内存泄露检测
    C++的XML编程经验――LIBXML2库使用指南
    C的xml编程-libxml2
    15 手写数字识别-小数据集
    14 深度学习-卷积
    13-垃圾邮件分类2
    12.朴素贝叶斯-垃圾邮件分类
    11.分类与监督学习,朴素贝叶斯分类算法
    9、主成分分析
    7.逻辑回归实践
  • 原文地址:https://www.cnblogs.com/ttzz/p/10542454.html
Copyright © 2011-2022 走看看