舍罕王的失算

2021-10-18  本文已影响0人  一路向后

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
上一篇 下一篇

猜你喜欢

热点阅读