日期:2014-05-20  浏览次数:20715 次

求java代码编写下面的程序,求高手啊
大整数的计算问题
(时间限制为: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


------解决方案--------------------
楼主是要自己写一个大数的实现?还只是能用就行
java.math.BigDecimal这个可以直接用
------解决方案--------------------
还有个整型的
java.math.BigInteger
------解决方案--------------------
乘方的设计思想给了,按照乘方的写一个加法的,最后把计算结果的前置的0全去掉就成了
Java code

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));

    }
}