大整数的计算问题
(时间限制为: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
(时间限制为: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
(时间限制为: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
java.math.BigDecimal这个可以直接用
java.math.BigInteger
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)); }
}