注册 登录
编程论坛 C++教室

数太大unsigned long long也数出不了

zp666 发布于 2021-09-14 21:15, 3380 次点击
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
int main()
{
    unsigned long long int P,s,n=1,k,i=0,m,y,sp=0;
    scanf("%llu",&k);
    do{
        s=pow(2,n)-1;
        P=pow(2,n-1)*s;n++;
        for(m=2;m<=s;m++){
            if(s%m==0){break;}
        }if(m==s){m=1;}else{continue;}
        for(m=1;m<P;m++){
            if(P%m==0){
                sp+=m;
            }
        }if(sp==P){m=1;i++;}else{i++;continue;}
    }while(i<k);
    printf("%llu=%llu*%llu",P,P/s,s);

   
    return 0;
 }
输入6以后就不行了,求解决!!!
5 回复
#2
牧人马2021-09-14 22:34
输入了1-7,后面两数相乘运算时间太长了,不太清楚题目要求干什么,非要这么算可以看一下大整数乘法的算法
#3
rjsp2021-09-15 11:47
根本看不懂你想干什么,为什么不将题目贴出来呢?
#4
zp6662021-09-15 22:07
回复 3楼 rjsp
题目要求的是求前八个完全数,可我这个只能求前5个,后面直接输出不了
#5
zp6662021-09-15 22:11
回复 2楼 牧人马
嗯嗯
#6
rjsp2021-09-16 08:52
本子论坛是“C++”,但你的代码看起来又像“C语言”。那我是给你 C代码呢,还是给 C++代码?

程序代码:
#include <cstdio>
#include <climits>

// 这个判断“素数”的算法是我随手乱写的,因为它不是本题的重点,你可以自行更换成效率比较高的算法
bool is_prime( unsigned long long n )
{
    if( n == 2 ) return true;
    if( n<2 || n%2==0 ) return false;

    for( unsigned long long i=3; i*i<=n; i+=2 )
        if( n%i == 0 )
            return false;
    return true;
}

// 求完美数
// 完美数定义: “自身的真因子之和”等于“自身”,例如 6、28、496、……
// 完美数性质: 当 2^p-1 是质数时(此时p一定也是质数),(2^p-1)*2^(p-1) 是一个完全数
int main( void )
{
    // (2^p-1)*2^(p-1) 的二进制形式是 111…(p个1)…1000…(p-1个0)…0,所以p不能超过unsigned long long位数的一半
    for( unsigned long long p=2; p<=sizeof(unsigned long long)*CHAR_BIT/2; p=(p-1)/2*2+3 )
    {
        if( !is_prime(p) || !is_prime((1ull<<p)-1) ) continue;

        unsigned long long a = (1ull<<p)-1; // 2^p-1
        unsigned long long b = 1ull<<(p-1); // 2^(p-1)
        unsigned long long c = a<<(p-1); // (2^p-1)*2^(p-1)
        printf( "%llu = %llu * %llu\n", c, b, a );
    }
}


输出
6 = 2 * 3
28 = 4 * 7
496 = 16 * 31
8128 = 64 * 127
33550336 = 4096 * 8191
8589869056 = 65536 * 131071
137438691328 = 262144 * 524287
2305843008139952128 = 1073741824 * 2147483647

1