大整数的计算问题
(时间限制为:100毫秒)
    在程序设计中,由于数据类型存储位的限制,要进行大整数的运算比较困难,例如能存储最大的正整数为264-1,如果要计算2020值(2020>280),利用通常计算方法就不能处理。聪明的程序员就能够知道2020的结果,处理方法可以采用将每次计算的结果使用四个长整数a,b来存储,如x=1230400049, 取a=x%10000=49,b=x/10000=123040;这样,x不能在计算机中存储,而a,b可以存储了,从而x*20=(a+b)*20=a*20+b*20,在设计程序时,起基本代码如下:
long a,b,c,d;
int i;
a=1;
b=0;
c=0;
d=0;
for(i=0;i<20;i++){
a*=20L;
b*=20L;
c*=20L;
d*=20L;
b+=a/100000000;
c+=b/100000000;
d+=c/100000000;
c%=100000000;
b%=100000000;
a%=100000000;
}
printf("%0ld%08Ld%08Ld%08Ld\n",d,c,b,a);
    现在请你根据以上的设计思想,编程计算S=11+22+33+44+55+…+nn的和。
标准输入:
   标准输入一个正整数n(1<n<=20)。
标准输出:
   标准输出从键盘输入的n值的计算结果S的值。
样例输入:
17
样例输出:
846136323944176515621

解决方案 »

  1.   

    又是大整数...以前都用字符串...现在又要long int....更麻烦了...
      

  2.   

    不好意思,题目我没弄好乘方符号,现在已经改好了,题目如下大整数的计算问题
    (时间限制为:100毫秒)
      在程序设计中,由于数据类型存储位的限制,要进行大整数的运算比较困难,例如能存储最大的正整数为264-1,如果要计算20^20值(20^20>280),利用通常计算方法就不能处理。聪明的程序员就能够知道20^20的结果,处理方法可以采用将每次计算的结果使用四个长整数a,b来存储,如x=1230400049, 取a=x%10000=49,b=x/10000=123040;这样,x不能在计算机中存储,而a,b可以存储了,从而x*20=(a+b)*20=a*20+b*20,在设计程序时,起基本代码如下:
    long a,b,c,d;
    int i;
    a=1;
    b=0;
    c=0;
    d=0;
    for(i=0;i<20;i++){
    a*=20L;
    b*=20L;
    c*=20L;
    d*=20L;
    b+=a/100000000;
    c+=b/100000000;
    d+=c/100000000;
    c%=100000000;
    b%=100000000;
    a%=100000000;
    }
    printf("%0ld%08Ld%08Ld%08Ld\n",d,c,b,a);
      现在请你根据以上的设计思想,编程计算S=1^1+2^2+3^3+4^4+5^5+…+n^n的和。
    标准输入:
      标准输入一个正整数n(1<n<=20)。
    标准输出:
      标准输出从键盘输入的n值的计算结果S的值。
    样例输入:
    17
    样例输出:
     846136323944176515621
      

  3.   

    楼主是要自己写一个大数的实现?还只是能用就行
    java.math.BigDecimal这个可以直接用
      

  4.   

    还有个整型的
    java.math.BigInteger
      

  5.   

    乘方的设计思想给了,按照乘方的写一个加法的,最后把计算结果的前置的0全去掉就成了public class Test2 {

    private class BigInt{
    public long a=0;//最低位
    public long b=0;
    public long c=0;
    public long d=0;//最高位
    }
    /**
     * 20以下的乘方
     * @param num (long) 大于1小于等于20的整数
     * @return BigInt
     */
    private BigInt power(long num){

    BigInt result = new BigInt();

    if(num>=1 && num<=20){

    result.a=1L;//起始值为1,作为基数用于计算乘方

    for(int i=0;i<num;i++){

    result.a*=num;
    result.b*=num;
    result.c*=num;
    result.d*=num;
    result.b+=result.a/100000000;
    result.c+=result.b/100000000;
    result.d+=result.c/100000000;
    result.c%=100000000;
    result.b%=100000000;
    result.a%=100000000;

    }
    } return result;

    }
    /**
     * 加法
     * @param num1 (BigInt) 第一个数
     * @param num2 (BigInt) 第二个数
     * @return BigInt
     */
    private BigInt add(BigInt num1,BigInt num2){

    BigInt result = new BigInt();

    if(num1!=null && num2!=null){

    result.a=num1.a+num2.a;
    result.b=num1.b+num2.b;
    result.c=num1.c+num2.c;
    result.d=num1.d+num2.d;
    result.b+=result.a/100000000;
    result.c+=result.b/100000000;
    result.d+=result.c/100000000;
    result.c%=100000000;
    result.b%=100000000;
    result.a%=100000000;

    }

    return result;
    }
    /**
     * 计算
     * @param num (long) 大于1小于等于20的整数
     * @return String
     */ 
    public String compute(long num){

    String result = "";

    if(num>=1 && num<=20){

    BigInt bigNum = new BigInt();

    for(long i=0;i<num;i++){

    bigNum = add(bigNum,power(i+1L));
    } result = String.format("%08d", bigNum.d);//格式化成8位数字,不足用0补位
    result += String.format("%08d", bigNum.c);
    result += String.format("%08d", bigNum.b);
    result += String.format("%08d", bigNum.a);
    result = result.replaceAll("^0+", "");//去掉首位的0
    }else{

    result = "输入不合要求!";
    } return result;


    public static void main(String args[]){ System.out.println(new Test2().compute(10L)); }
    }