1.问题描述
相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8x8共64格象棋棋盘说: 陛下,请您赏给我一些麦子吧。就在棋盘的第1格中放1粒,第2格放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依次放完64格,我就感激不尽了。舍罕王让人扛来一袋麦子,他要兑现承诺。请编程求出国王总共需要将多少麦子赏赐给他的宰相。
2.源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gmp.h>
int main()
{
mpz_t sum, a, b;
int i;
mpz_init(sum);
mpz_init(a);
mpz_init(b);
mpz_init_set_ui(sum, 0);
mpz_init_set_ui(a, 2);
for(i=0; i<64; i++)
{
mpz_pow_ui(b, a, i);
mpz_add(sum, sum, b);
}
gmp_printf("国王总共需要赏赐给宰相的麦子数为: %Zd\n", sum);
mpz_clear(sum);
mpz_clear(a);
mpz_clear(b);
return 0;
}
3.编译源码
$ gcc -o test test.c -std=c89 -I/usr/local/include -L/usr/local/lib64 -lgmp -Wl,-rpath=/usr/local/lib64
4.运行及其结果
./test
国王总共需要赏赐给宰相的麦子数为: 18446744073709551615
网友评论