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;
}