巧思觉简单小题

题目一:

特殊的数字 
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星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值