题目描述
相传国际象棋是古印度舍罕王的宰相达依尔发明的.舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐.这位聪明的宰相指着8*8共64格的象棋说:陛下,请您赏给我一些麦子吧.就在棋盘的第1格放1粒,第2格放2粒,第三格放4粒,以后每一格都比前一格增加一位,依此放完棋盘一64格,我就感激不尽了.舍罕王让人扛了一袋麦子,他要兑现他的许诺.
请问,国王要兑现他的许诺共要多少粒麦子赏赐他的宰相?
输入
无
输出
以整数形式输出,不要其它符号
样例输入
无
样例输出
18446744073709552000
代码:
网上有很多double类型解法,写下整形数组解法。
#include<stdio.h>
#include<string.h>
int main() {
int a[30], b[30];
int cntb = 0, cnta = 0;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
b[0] = 1;
a[0] = 1;
for (int i = 2; i <= 64; i++) {
//b[] *2
for (int j = 0; j <= cntb; j++) {
b[j] = b[j] * 2;
}
for (int j = 0; j <= cntb; j++) {
if (b[j] >= 10) {
b[j + 1] = b[j + 1] + b[j] / 10;
b[j] = b[j] % 10;
if (j == cntb) cntb++;
}
}
//a[]+b[]
for (int i = 0; i <= cntb; i++) {
a[i] = a[i] + b[i];
}
for (int j = 0; j <= cntb; j++) {
if (a[j] >= 10) {
a[j + 1] = a[j + 1] + a[j] / 10;
a[j] = a[j] % 10;
if (j == cntb) cnta = cntb + 1;
}
}
}
for (int i = cnta; i >= 0; i--) {
printf("%d", a[i]);
}
printf("\n");
getchar();
getchar();
return 0;
}
/* double s=0,sn=1;
for(int i=1;i<=64;i++){
s = s+ sn;
sn = sn*2;
}
printf("%.0f",s);
*/