读书人

求java代码编写下面的程序求高手啊解

发布时间: 2012-01-13 22:43:30 作者: rapoo

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

读书人网 >J2SE开发

热点推荐