1.棋盘放麦子
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
#include<bits/stdc++.h> using namespace std; unsigned long long total,count1 = 1; int main() { total += count1; for(int i = 1; i<=63; i++){// 1 : 2的1次方 2 : 2的2次方 2^0+2^1+...+2^63 count1 *= 2; // i = 1, count1:2 i = 2 count1: 4 total += count1; //cout<<total<<endl; } cout<<total<<endl; return 0; }
这个题如果使用double类型存储数据,运算时会出现精度损失的问题.可以使用 long long 类型,还得是无符号的才行,有符号的会越界.
2.猜生日
今年的植树节(2012 年 3 月 12日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”
“把我出生的年月日连起来拼成一个 8 位数(月、日不足两位前补 0)正好可以被今天的年、月、日整除!”
他想了想,又补充到:“再给个提示,我是 6 月出生的。”
根据这些信息,请你帮小明算一下,他叔叔的出生年月日。
格式是年月日连成的 88 位数。例如,如果是 1948 年 6月 12 日,就写:19480612
#include<bits/stdc++.h> #include<sstream> using namespace std; int main() { bool flag = false; int date; stringstream s; string day,year; string str; for(int i = 1900; ; i++){ s.clear(); s<<i; s>>year; s.clear(); for(int j = 1; j <= 30; j++){ str=""; day = ""; s<<j; s>>day; str = j <= 9 ? (year+ "060"+day) :(year+ "06"+day);//如果天数<= 9 需要补0. s.clear(); s<<str; s>>date; s.clear(); if(date % 2012 == 0 && date % 3 == 0 && date % 12 == 0){ flag = true; break; } } if(flag){ cout<<date<<endl; break; } } return 0; }
上面使用字符串来做太过于麻烦,看了别人的代码发现可以直接做
#include<bits/stdc++.h> using namespace std; int date,m=6; int main() { for(int i = 1900; i < 2012; i++){//19480612。 for(int j=1; j<=30; j++){ date = i * 10000 + m* 100+j; if(date % 2012 == 0 && date % 3 == 0 && date % 12 == 0){ cout<<date<<endl; return 0; } } } return 0; }