九度 1050 哈工大 2010 复试上机

题目1050:完数

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5878

解决:2430

题目描述:

    求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数。

输入:

    测试数据有多组,输入n,n数据范围不大。

输出:

    对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。

样例输入:
6
样例输出:
6
来源:
2010年哈尔滨工业大学计算机研究生机试真题

题目大意: 这里不说了
解题方法思路:首先要有一个判断完数的函数,加之数据n 不大 特别水了已经
下面给出未成功代码:
#include<iostream>
#include<cstdio>
using namespace std;

bool wanshu(int x)
{
    int i;
    int ans = 0;
    for(i = 1 ; i < x ; i++)
    {
        if(x%i == 0)
        {
            ans += i;
        }
    }
    if(ans == x) return true;
    return false;
}

int main()
{
    int n, i;
    while(cin>>n)
    {
        for(i = 1; i <= n; i++)
        {
            if(wanshu(i))
            {
                printf("%d ", i);
            }
        }
    }
    return 0;
}

为什么呢 ,因为没有达到题目要求 不能出现多余空格 ,这对AC 者的功底就要深入考察了
下面给出AC 代码:
#include<iostream>
#include<cstdio>
using namespace std;

bool wanshu(int x)
{
    int i;
    int ans = 0;
    for(i = 1 ; i < x ; i++)
    {
        if(x%i == 0)
        {
            ans += i;
        }
    }
    if(ans == x) return true;
    return false;
}

int main()
{
    int n, i;
    while(cin>>n)
    {
        if(n < 6)
        {
            cout<<endl;
        }
        else
        {
            cout<<6;
        for(i = 7; i <= n/2; i++)
        {
            if(wanshu(i))
            {
                printf(" %d", i);
            }
        }
        }
    }
    return 0;
}
下面给出一种打表的方式 但是没有被AC 掉的解法:
#include<iostream>
#include<cstring>
using namespace std;
#define Max 100

int perfect[Max];//用来存储完数的
void init()
{
//仿照素数的球阀进行打表
//先压缩一下状态 可值能被整除的最多到i/2
  int k = 0;
  for(int i = 0; i < 10000; i++)
  {//下面写出完数判断函数
      int ans = 0;
      int j ;
      for(j = 1; j <= i/2; j++)
      {
          if(i%j == 0)
          {
              ans+= j;
          }
      }
      if(ans == i)
      {
          perfect[k] = i;
          k++;
      }
  }
}
int main()
{//第一个完数是6

    memset(perfect, 0 , sizeof(perfect));
    init();
    int n ;
    while(cin>>n)
    {
        if(n < 6)
        {
            cout<<endl;
        }
        else
        {
            cout<<6;
        //这里需要把1排除因此从2开始
        for(int i = 2; perfect[i] <= n; i++)
        {
            cout<<" "<<perfect[i];
        }
        }
    }
    return 0;
}

好吧以上就是解题过程了,今天的题比较水 但是哈工大并不水,纯属找捏水题找自信。。。。

wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值