题目一:
特殊的数字
Problem Description
有些数字的立方的末尾正好是该数字本身。
比如:1,4,5,6,9,24,25,....
请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。
请提交该整数,不要填写任何多余的内容。
Input
无
Output
输出一个整数
思路:注意立方的末尾是数字本身,比如25*25*25=15625,末尾与25比较,而不是和5比较。
答案:36
题目二:
破除迷信
Problem Description
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。
Input
无
Output
输出一个整数
思路:口算题,从最高位到最低位每一位可以取8,9,9,9,9种不同的数字
答案:52488
题目三:
残酷的生物圈
Problem Description
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!
Input
无
Output
输出共两行,每一行一个整数,分别为两种情况下Y的数目
思路:换成120分钟,柳暗花明
#include<iostream>
using namespace std;
#define ll long long
void calc(ll x,ll y)
{
for(int i=1;i<=120;i++)
{
if(y<0)
{
y=0;
break;
}
if(i%6==0)
x=2*x;
if(i%4==0)
y=2*y;
if(i%2==1)
y-=x;
// cout<<"当前i:"<<i<<"当前x:"<<x<<" "<<"当前y:"<<y<<endl;
}
cout<<y<<endl;
}
int main()
{
calc(10,89);// 0
calc(10,90);// 94371840
return 0;
}
题目三:
海盗拼酒
Problem Description
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
Input
无
Output
输出若干行。
每一行有5个数字(最后一个数字为0),数字之间用逗号分隔,注意每一行的最后不要有逗号,也不要有空格。如果有多个答案,则按第一个数字从小到大进行排序。
思路:看破题目很简单。设五次分别为i,j,k,t,0 则满足1/i + 1/j + 1/k +1/t =1即可。
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
for(int i=1;i<=20;i++)
{
for(int j=1;j<=20;j++)
{
if(i<=j) continue;
for(int k=1;k<=20;k++)
{
if(j<=k) continue;
for(int t=1;t<=20;t++)
{
if(k<=t) continue;
double x1=1.0*1/i;
double x2=1.0*1/j;
double x3=1.0*1/k;
double x4=1.0*1/t;
if( fabs(x1+x2+x3+x4-1)<=0.00001 )
//和 x1+x2+x3+x4==1没区别
{
printf("%d,%d,%d,%d,%d\n",i,j,k,t,0);
}
}
}
}
}
return 0;
}
题目四:
小明的魔术
Problem Description
小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:
他手里握着一叠扑克牌:A,2,....J,Q,K 一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。
只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。
这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K
请你计算一下,小明最开始的时候手里牌的顺序是怎样的。
把结果写出来,逗号分割,小明“魔术”开始时,最下面的那张牌输出为第一个数据。
考场不提供扑克牌,你只能用计算机模拟了,撕碎草稿纸模拟扑克属于作弊行为!另外,你有没有把录像倒着放过?很有趣的!
Input
无
Output
输入A, 2, 3,...,Q,K的一种排列方式,中间用逗号分隔。
#include<iostream>
#include<algorithm>
using namespace std;
//7,A,Q,2,8,3,J,4,9,5,K,6,10
//逆过程就是:将桌子上牌拿回手上,再把手上最上面的牌放到最下面。
//本题可以暴力解,即全排列+模拟解。因为数据不大也可以手动演算(实在不行的话)
int main()
{
int a[15]={13};
for(int i=1;i<=12;i++)
{
int p=13-i; //当前插入牌型
a[i]=p;
int tmp=a[0];
for(int j=0;j<i;j++)
a[j]=a[j+1];
a[i]=tmp;//以上三行 将a[0]放到最下面
}
for(int i=12;i>=0;i--)//注意要倒着输出!
cout<<a[i]<<",";
//因为我们是将反着的牌,最上面设为 a[0],所以把它正过来,最下面的才是第一张牌,一定要好好读题目!
return 0;
}
题目五:
诚实的海盗
Problem Description
有5个海盗,相约进行一次帆船比赛。
比赛中天气发生突变,他们被冲散了。
恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人。
第一个人在沙滩上发现了一堆金币。他把金币分成5等份。发现刚好少一个金币。他就从自己口袋拿出一个金币补充进去,然后把属于自己的那份拿走。
第二个到达的人也看到了金币,他也和第一个人一样,把所有金币5等分,发现刚好缺少一个金币,于是自己补进去一个,拿走了属于自己的那份。
第三,第四,第五人的情况一模一样。
等他们到了目的地,都说自己的情况,才恍然大悟,一起去荒岛找金币,然而再也没有找到荒岛。他们都惋惜地说:岛上还有一千多枚金币呢!
请你根据这些信息,推算荒岛上最初有多少金币?
这是一个整数,不要填写任何多余的内容(比如说明性的文字等)
Input
无
Output
输出一个整数
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
for(int i=1;i<=10000;i++)
{
int ii=i;//将i赋给ii 用ii来操作
int cnt=0;
for(int k=0;k<5;k++)
{
if((ii+1)%5!=0)
break;
cnt+=(ii+1)/5;
ii=(ii+1)-(ii+1)/5;
if(k==4&&ii>=1000&&ii<2000)
{
cout<<i<<endl<<"剩下"<<ii<<endl;
}
}
}
return 0;
}
题目六:
电子秤最大读数
Problem Description
X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。
7
5 8
7 8 8
9 2 7 2
8 1 4 9 1
8 1 8 8 4 1
7 9 6 1 4 5 4
5 6 5 5 6 9 5 6
5 5 4 7 9 3 5 5 1
7 5 7 9 7 4 7 3 3 1
4 6 4 5 5 8 8 3 2 4 3
1 1 3 3 1 6 6 5 5 4 4 2
9 9 9 2 1 9 1 9 2 9 5 7 9
4 3 3 7 7 9 3 6 1 3 8 8 3 7
3 6 8 1 5 3 9 5 8 3 8 1 8 3 3
8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9
8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4
2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9
7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6
9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3
5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9
6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4
2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4
7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6
1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3
2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8
7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9
7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6
5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。
假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
电子秤的计量单位很小,所以显示的数字很大。
工作人员发现,其中读数最小的电子秤的示数为:2086458231
请你推算出:读数最大的电子秤的示数为多少?
注意:需要提交的是一个整数,不要填写任何多余的内容。
Input
无
Output
输出一个整数,为电子秤的最大读数
思路:
//1.scanf和printf 的精度比 cin和cout要高,即保留的小数点后面的位数要更多一些,精度的不同会使结果有误差。
//2.对于前者,要会 printf("%.0lf",ans)保留0位小数, printf("%.1lf",ans)保留一位小数。
//3.对于后者,要会setprecision(12)保留12位有效数字。与上述不同,此处是有效数字。 <iomanip>头文件中。
#include<iostream>
#include<iomanip>
using namespace std;
//answer:72665192664
double num[35][35];
int main()
{
for(int i=1;i<=29;i++)
{
for(int j=1;j<=i;j++)
cin>>num[i][j];
}
for(int i=1;i<=29;i++)
{
for(int j=1;j<=i;j++)
{
//因为设置是从1开始,所以直接加就好了,不存在越界问题
num[i+1][j]+=num[i][j]/2;
num[i+1][j+1]+=num[i][j]/2;
}
}
double minv=99999,maxv=-1;
for(int i=1;i<=30;i++)
{
if(num[30][i]>maxv)
maxv=num[30][i];
if(num[30][i]<minv)
minv=num[30][i];
}
double res=2086458231/minv*maxv;
// cout<<minv<<endl<<maxv<<endl; 3.88633 和 135.349
cout<<setprecision(12)<<res<<endl; //直接 cout<<res 弄不出来。要用setprecision(),<iomanip>头文件,括号里面的数字通过估算。
return 0;
}