| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
一、这是题目 
 
 1. 舍罕王的失算 
 
相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8 * 8 共 64 格的象棋说:“陛下,请您赏给我一些麦子吧。就在棋盘的第 1 格放 1 粒,第 2 格放 2 粒,第三格放 4 粒,以后每一格都比前一格增加一倍,依此放完棋盘 64 格,我就感激不尽了。”。舍罕王听了达依尔这个“小小”的要求,想都没想就满口答应下来。 
 
 结果在给达依尔麦子时舍罕惊奇地发现要给的麦子比自己想象的要多得多,于是他进行了计算,结果令他大惊失色。请问,舍罕王要兑现他的许诺共要多少粒麦子赏赐他的宰相?如果每25000粒麦子重1kg,那么舍罕王应该给予达依尔多少公斤麦子? 
 
 
 
 
二、这是代码 
01.#include <stdio.h> 
 
02.#include <math.h> 
 
03. 
 
04.int main() 
 
05.{ 
 
06.        unsigned long long sum = 0; 
 
07.        unsigned long long temp; 
 
08.        unsigned long long weight; 
 
09.        int i; 
 
10. 
 
11.        for (i=0; i < 64; i++) 
 
12.        { 
 
13.                temp = pow(2, i); 
 
14.                sum = sum + temp; 
 
15.        } 
 
16. 
 
17.        weight = sum / 25000; 
 
18. 
 
19.        printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum); 
 
20.        printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight); 
 
21. 
 
22.        return 0; 
 
23.} 
 
三、提问:答案是一个20位的数字,但在程序申明变量的时候,unsigned long long int   sum 这个sum 的位数最多才16位,请问怎么可以放下答案是20位的数字呢? 
unsigned long long int型的大小为8字节,也就是64位,其最大值为2^64-1,也就是这边的sum的值,也就是说,这里sum的值已经是这种类型所能表示的最大值了,你可以看看输出sum+1的值看看。 
 
 
 |   
 
 
 
 |