如何实现1^1+2^2+……20^20?

求教:如何用java语言实现1^1+2^2+……20^20,要求不能用大数BigInteger;不能用Math;不能使用实型数;不能溢出;要求使用数组,每个数组元素只存放一位;使用循环控制。
有没有大佬能帮忙看一看啊……c++也可以。谢谢各位大佬!

3个回答

ref 大数乘法与大数加法 java实现
https://blog.csdn.net/bitcarmanlee/article/details/51774423
应该就能实现你的问题,也许会比较慢。20^20=10^20*2^20,真是一个天文数字

每个数组元素只存放一位 是什么意思,数组的第i位存放i的i次方么,还是存放结果的第i位。
20的20次方能到27位数,已经超过了long long int能表示的最大值。
不是不能用大数据是不能用大数(BigIntenger)吧,意思就是自己实现一个?

#include <iostream>
#include <stdlib.h>

using namespace std;

#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))

class BigInt{
private:
    char *list;
    int length;
public:
    BigInt(int num);
    BigInt(string str);
    BigInt(const BigInt& t);
    ~BigInt();

    BigInt operator+(const BigInt& t);
    BigInt operator+=(const BigInt& t);
    BigInt operator*(const BigInt& t);
    BigInt operator*=(const BigInt& t);
    BigInt operator=(const BigInt& t);
    BigInt operator=(int t);

    friend ostream& operator<<(ostream& s,const BigInt& t);
}; 

BigInt::BigInt(int len = 1){
    if(len < 1)
        len = 1;
    length = len;
    list = new char[length];
    for(int i = 0; i < length; i++)
        list[i] = 0;
}

BigInt::BigInt(string str){
    length = str.length();
    list = new char[length];
    for(int i = 0; i < length; i++)
        list[i] = str[length - i - 1] - '0';
}

BigInt::BigInt(const BigInt& t){
    length = t.length;
    list = new char[length];
    for(int i = 0; i < length; i++)
        list[i] = t.list[i];
//  cout << "Copy :" << endl;
//  cout << "  From :" << t << endl;
//  cout << "  To   :" << *this << endl;
}

BigInt::~BigInt(){
//  cout << "Destroy : ";
//  cout << *this << endl;
//  system("pause"); 
    delete[] list;
}

BigInt BigInt::operator+(const BigInt& t){
    int l1 = (list[length-1] ? length : length - 1);
    int l2 = (t.list[t.length-1] ? t.length : t.length - 1);

    BigInt temp(max(l1, l2) + 1);
    for( int i = 0; i < max(l1, l2); i++){
        if( i < length )
            temp.list[i] += list[i]; 
        if( i < t.length )
            temp.list[i] += t.list[i];
        temp.list[i+1] += temp.list[i] / 10;
        temp.list[i] %= 10;
    }
    return temp;
}

BigInt BigInt::operator+=(const BigInt& t){
    *this = *this + t;
    return *this;
}

BigInt BigInt::operator*(const BigInt& t){
    int l1 = (list[length-1] ? length : length - 1);
    int l2 = (t.list[t.length-1] ? t.length : t.length - 1);
//  cout << "l " << l1 << " " << l2 << endl;
    BigInt temp(l1 + l2);

    int sum = 0;
    for(int i = 0; i < l1 + l2; i++){
        for(int j = max(0, i - l2 + 1); j < l1 && j <= i; j++){
            sum += list[j] * t.list[i - j];
        }
        temp.list[i] = (sum % 10);
//      cout << "[" << i << "] = " << sum << ", temp[" << i << "] = " << (int)temp.list[i] << endl;
        sum /= 10;
    }

    return temp;
}

BigInt BigInt::operator*=(const BigInt& t){
    *this = *this * t;
    return *this;
}

BigInt BigInt::operator=(const BigInt& t){
    delete[] list;
    length = t.length;
    list = new char[t.length];
    for(int i = 0; i < length; i++)
        list[i] = t.list[i];
}

BigInt BigInt::operator=(int t){
    int len = 0, n = t;
    while(n){
        len++;
        n/=10;
    }

    if(len<1) 
        len = 1;
    length = len;

    delete[] list;
    list = new char[length];

    for(int i = 0; i < length; i++){
        list[i] = t % 10;
        t /= 10;
    }
    return *this;
}

ostream& operator<<(ostream &out,const BigInt& t){
    int len = (t.list[t.length-1] ? t.length : t.length - 1);
    for(int i = len - 1; i >= 0; i--)
        out << (int)t.list[i];
    return out;
}

int main(){
    BigInt sum, a, b;
    for(int i = 1; i <= 20; i++ ){
        a = i, b = i;
        for( int j = 1; j < i; j++)
            a = a * b;
        cout << i << "^" << i << " = " << a << endl;
        sum += a;
    }

    cout << "sum = " << sum << endl;
}
JonathanYan
JonathanYan 回复牵着气球的路人: 修改答案了,可以看下
5 个月之前 回复
weixin_45368531
牵着气球的路人 要求是最后结果也用数组存储,同样是一个元素放一个数
5 个月之前 回复
weixin_45368531
牵着气球的路人 确实是不能用大数……对不起刚开始学术语记混了……
5 个月之前 回复
weixin_45368531
牵着气球的路人 您好。比如说4的四次方是256,就要存放为a[0]=2,a[1]=5,a[2]=6。在计算过程中,以14为例,也是要b[0]=1,b[1]=4这样来进行计算。
5 个月之前 回复

按你的要求来的,写成博客增加增加人气
https://blog.csdn.net/weimingjue/article/details/101760480

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

4
JAVA用户从键盘输入一个整型数,输出其对应的2、3、4……15、16进制数?
1
psql怎么新建一列车主信息,往里面填充张1,张2,张3,张4,张5……
1
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13……求出这个数列的前n项之和?
2
平方公式的计算,C语言
1
爬取拼多多遇到js加密,破解一天没进展,求哪位大佬指点迷津……
2
求解一个和平方数列求和有关的解法的问题,采用C语言解决这个问题的思路实现怎么做?
1
已知x1,x2,y的数据,y=k(x1^n1)*(x2^n2)……,怎么求出指数n1,n2的数值?
0
一个多项是的公式的计算问题,运用C语言编程技术的实现的方式是
2
用递归关系求1!+2!+……+n! 从4开始,运行时就停止工作,为什么啊?
0
平方距离的计算,求最佳的开方数,用C语言的程序的设计的方式来实现怎么做
0
表达式公式的一个计算的问题,如何利用C语言的程序的设计的方式来实现表达式的?
0
keras实现人脸识别,训练失败……请教大神指点迷津!!!
1
1^2+3^2+5^2+……+ n ^2.公式的计算的问题怎么采用C语言程序代码编写的过程技术的实现的方式
0
平方求和只计算奇数,怎么运用C程序的编写的代码的过程的思路解法去实现的呢?
0
ubuntu:依赖: uno-libs3 (= 5.1.6~rc2-0ubuntu1~xenial3) 但是 5.1.6~rc2-0ubuntu1~xenial7 正要被安装
1
c语言题目 急求今晚内要
1
怎么来实现一个公式的计算,用C语言来实现的
0
Calculate the formula是怎么用代码来编写
0
Another kind of Fibonacci 数列
1
Calculate the formula 公式计算