题目描述
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
由于数值过大用int,long类型的数值存不下,因此只能用String类型来存储,就涉及到了大数乘法的方法,但是因为一个因子为2所以又比大数乘法简单一些。
public static void main(String[] args) {
String s = "1";
for(int i = 1;i <= 64;i++) {
s = sub(s);
}
int l = s.length();
String s1 = s.substring(l-1);
String s2 = s.substring(0,l-1);
char ss = s1.charAt(0);
int t = (int)(ss-'0');
t--;
char sss = (char)(t+'0');
s = s2+sss;
System.out.println(s);
}
public static String sub(String s) {
char arr[] = s.toCharArray();
String A = "";
int f = 0;
for(int i = arr.length-1;i >= 0;i--) {
int tem = (int)(arr[i]-'0');
tem *= 2;
tem += f;
if(tem >= 10)
f = 1;
else
f = 0;
tem = tem%10;
char ss = (char)(tem+'0');
A = ss+A;
}
if(f == 1)
A = "1"+A;
return A;
}