自幂数的某种写法

自幂数计算,有点懒,网上找代码,没找着执行速度比较快的,反正最快的是直接把答案贴上,直接输出,但也得先找出它们;

懒懒地找了半天,还是自己写个,如下

#include <iostream>
using namespace std;

long long q[11][10] = {
    {-1,1,1,1,1,1,1,1,1,1},
    { 0,1,2,3,4,5,6,7,8,9},
    { 0,1,4,9,16,25,36,49,64,81},
    { 0,1,8,27,64,125,216,343,512,729},
    { 0,1,16,81,256,625,1296,2401,4096,6561},
    { 0,1,32,243,1024,3125,7776,16807,32768,59049},
    { 0,1,64,729,4096,15625,46656,117649,262144,531441},
    { 0,1,128,2187,16384,78125,279936,823543,2097152,4782969},
    { 0,1,256,6561,65536,390625,1679616,5764801,16777216,43046721},
    { 0,1,512,19683,262144,1953125,10077696,40353607,134217728,387420489},
    { 0,1,1024,59049,1048576,9765625,60466176,282475249,1073741824,3486784401ULL}
};

void sorta(long long a[], int n) {
    for (int i=0; i<n; i++) {
        for (int j=i+1; j<n; j++) {
            if ( a[i] > a[j] ) {
                long long t = a[j];
                a[j] = a[i];
                a[i] = t;
            }
        }
    }
}

int main() {

    long long ans[100] = {0};
    int cnt = 1;
    
    for (int t=1; t<=10; t++) { 
    for (int i0=0; i0<=t; i0++) {
    for (int i1=0; i1<=t-i0;i1++) {
    for (int i2=0; i2<=t-i0-i1; i2++) {
    for (int i3=0; i3<=t-i0-i1-i2; i3++) {
    for (int i4=0; i4<=t-i0-i1-i2-i3; i4++) {
    for (int i5=0; i5<=t-i0-i1-i2-i3-i4; i5++) {
    for (int i6=0; i6<=t-i0-i1-i2-i3-i4-i5; i6++) {
    for (int i7=0; i7<=t-i0-i1-i2-i3-i4-i5-i6; i7++) {
    for (int i8=0; i8<=t-i0-i1-i2-i3-i4-i5-i6-i7; i8++) {
    for (int i9=0; i9<=t-i0-i1-i2-i3-i4-i5-i6-i7-i8; i9++) {
        int a[10] = {i0, i1, i2, i3, i4, i5, i6, i7, i8, i9};
        int at = 0;
        for (int i=0; i<10; i++) {
                at+=a[i];
        }
        if (at!=t) continue;
        
        long long s = 0;
        for (int i=0; i<=9; i++) {
            s = s+a[i]*q[t][i];
        }    
        int c[10]={0};
         
        long long ss = s;
        while (s!=0) {
            c[s%10]++;
            s=s/10;
        }
        
        int f = 1;
        for (int i=0; i<10; i++) {
            if (a[i] != c[i]) {
                f = 0;
                break;
            }
        }
        if (f == 1) {
            ans[cnt] = ss;
            cnt++;
        }
    }    
    }    
    }    
    }
    }    
    }
    }
    }
    }    
    }    
    }

    sorta(ans, cnt);
    for (int i=0; i<cnt; i++) {
        cout << ans[i] << ' ';
    }
    
    
  
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值