Time Limit: 10 second

Memory Limit: 2 MB

问题描述

完全数又称完数、完美数、完备数,是一些特殊的自然数,它所有真因子(即除自己以外的因子)的和等于它本身。例如:6=1+2+3,6是一个完数。

至今为止,人类共发现了46个完数,由于简单类型的数据范围有限,所以仅能求出前n(n<=8)个完数。

Input

一个整数n

Output

有n行,输出前n个完数,每个数占一行

Sample Input

3

Sample Output

6
28
496

【题解】

如果直接暴力求解 会超时。10s都不够用。

这题考的是数论。有点变态。

完全数和梅森数素数有一个一一对应的关系

即对于一个梅森素数mp = 2^p - 1,必有 一个完全数 2^(p-1) * mp;

比如:p=3
Mp=2^3-1=7也是素数
则有完全数2^(3-1)*(2^3-1)=4*7=28

平台很奇怪,我用lld输出,输出来的结果是对的,在平台上却显示错误,后来我没用lld输出,一位一位地存入int数组中,再一位一位地输出。

【代码】

#include <cstdio>
#include <cmath> const int maxn = 1000,maxl = 1000; int num = 0,n; void input_data()
{
scanf("%d",&n);
} bool can(long long x) //判断x是否为质数
{
if (x < 2) return false;
int d = sqrt(x);
for (int i = 2;i <=d;i++)
if ( (x % i) == 0)
return false;
return true;
} void get_ans()
{
int p = 1;
while (num != n) //如果还没有找到所需的数目就继续找。
{
long long int mp = 1;
for (int i = 1;i <= p;i++) //算2^p
mp = mp*2;
mp--;
if (can(mp)) //如果这个梅森数是质数
{
num++;
long long int t = 1;
for (int i = 1;i <= p-1;i++)
t = t * 2;
t = t * mp; //算出完全数
int temp[maxl]; //把这个完全数一位一位地存入int数组;
int i = 0;
while (t > 0)
{
temp[++i] = t % 10;
t = t /10;
}
for (int j = i;j >=1;j--) //再一位一位输出
printf("%d",temp[j]);
printf("\n");
}
p++;
}
} int main()
{
input_data();
get_ans();
return 0;
}

【2047】求前n个完全数的更多相关文章

  1. 堆排序 海量数据求前N大的值

    最(大)小堆的性质: (1)是一颗完全二叉树,遵循完全二叉树的所有性质. (2)父节点的键值(大于)小于等于子节点的键值 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2. ...

  2. poj 2752 Seek the Name, Seek the Fame【KMP算法分析记录】【求前后缀相同的子串的长度】

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14106   Ac ...

  3. Java版求1000以内的完全数

    /* * 若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数,简称完数. * 例如:6=1+2+3. * 题目:求1000以内的完全数. */ public cl ...

  4. 两个序列求前k大和

    ---恢复内容开始--- 没有题目,没有题意,这是学长提过的一个技巧,给你两个排好序的序列,每次可以各从中取一个,求前k大的和, 一个优先队列,先将a序列中最大的那个和b序列所有元素相加存进队列中,每 ...

  5. 利用快排partition求前N小的元素

    求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...

  6. 求前n项正整数的倒数和

    求前n项正整数的倒数和 前n项正整数的和是一个发散的序列,学过高等数学的这个都知道.所以它没有一个精确的公式,但是近似的公式是有的: 1 + 1/2 + 1/3 + …… + 1/n ≍ ln n + ...

  7. BZOJ2006:超级钢琴(ST表+堆求前K大区间和)

    Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...

  8. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  9. JAVA 基础编程练习题20 【程序 20 求前 20 项之和】

    20 [程序 20 求前 20 项之和] 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和. 程序分析:请抓住分子与分母的变化规律. pac ...

随机推荐

  1. PHP 7.1安装xhprof进行性能分析

    安装扩展该 xhprof扩展版本是从 https://github.com/longxinH/xhprof 获取的(第三方的一个库,官方版本不支持php7) 下载并编译xhprof扩展在web的htm ...

  2. gSOAP 使用WebServer心得

    关于正常怎么使用gSOAP的话,下面那篇博客已经讲得非常详细,我就不再赘述了 https://www.cnblogs.com/dengpeng1004/p/6165751.html 问题1: WCF ...

  3. Android 控件:CheckBox

    首先,在布局文件里注冊CheckBox activity_main.xml <LinearLayout xmlns:android="http://schemas.android.co ...

  4. Android中关于JNI 的学习(零)简单的样例,简单地入门

    Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...

  5. 对 hiren bootcd 15.2 中的 XP 系统作了汉化, 同时支持中文输入法。提供下载

    对 hiren bootcd 15.2 中的 XP 系统作了汉化, 同时支持中文输入法.提供下载 对该PE 中的 XP 系统作了汉化, 由于一个 中文字库 就要 10M 多:加之原系统过于精简,对中文 ...

  6. @JSONField 注解说明

    转自:https://blog.csdn.net/suyimin2010/article/details/80617538 导入@JSONField 注解: import com.alibaba.fa ...

  7. Vue 消息无缝滚动

    vue实现消息向上无缝滚动效果 <ul class="new-list" :class="{anim:animate}" @mouseenter=&quo ...

  8. libcurl 通过http协议下载文件并显示下载进度

    vc6 测试工程下载地址:http://download.csdn.net/detail/mtour/8068053 代码如下: size_t my_write_func(void *ptr, siz ...

  9. JS防止全局变量污染解决方案

    1.目前出现的问题: a.随意使用全局变量,会存在冲突的风险和难以解决的问题. b.现有JS代码共享流程中的状态,参数,都是通过按钮传递,非常别扭,不易于管理. c.通过完成后的代码很难知晓业务流程, ...

  10. serialport串口通讯

    在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信 = System.IO.Ports.SerialPort.GetPortNames();获取电脑有哪几个 ...