蓝桥杯历年穷举题
蓝桥杯历年穷举题
2013年第一题高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
#include<stdio.h>
int isleap(int year)//判断是否为闰年
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
int main()
{
int day;
int month[2][12]={
31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31,
};//二维数组存放闰年和非闰年的时候
int n=8113,year=1777,monthnum=4,daynum=30;
for(;year<=2020;year++)
{
if(isleap(year))
n-=366;
else
n-=365;
if(n<0)
{
if(isleap(year))
n+=366;
else
n+=365;
break;
}
}
for(day=1;day<n;day++)
{
if(daynum<month[isleap(year)][monthnum-1])
daynum++;
else {
daynum=1;
monthnum++;
}
}
printf("%d-%d-%d",year,monthnum,daynum);
return 0;
}
2013年第二题马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
# include <stdio.h>
int main()
{
int a,b,c,d,e,num=0;
for(a=1;a<10;a++)
{
for(b=1;b<10;b++)
{
if(a==b)
continue;
for(c=1;c<10;c++)
{
if(c==b||c==a)
continue;
for(d=1;d<10;d++)
{
if(d==a||d==b||d==c)
continue;
for(e=1;e<10;e++)
{
if(e==a||e==b||e==c||e==d)
continue;
if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
num++;
}
}
}
}
}
printf("%d\n", num);
}
2013年第三题第39级台阶
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
# include <stdio.h>
int dp[50][2];
int main()
{
int i;
dp[0][0]=1;//在第0级台阶 走了偶数步
dp[0][1]=0;//在第0级台阶 走了奇数步
dp[1][0]=0;//在第1级台阶 走了偶数步
dp[1][1]=1;//在第1级台阶 走了奇数步
for(i=2;i<=39;i++){
dp[i][0]=dp[i-2][1]+dp[i-1][1];
dp[i][1]=dp[i-2][0]+dp[i-1][0];
}
printf("%d",dp[39][0]);
return 0;
}
2014年第一题啤酒和饮料
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
#include <stdio.h>
int main()
{
int i,j;
for(i=1;i<=82.3/1.9;i++)
{
for(j=1;j<i;j++)
{
if(fabs(82.3*1.0-i*1.9-j*2.3)<=0.00001)
printf("%d\n",j);
}
}
return 0;
}
2014年第二题切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
#include <stdio.h>
#include <math.h>
int main()
{
int a[12],i;
a[1]=2;
for(i=2;i<=11;i++)
a[i]=a[i-1]+pow(2,i-2);
printf("%d\n",a[11]);
return 0;
}
2014年第三题李白打狗
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
#include <stdio.h>
int main()
{
int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,r,sum,w,t,z=0,v,s[15];//定义路上的15次遇到店和花
for(a=1;a<=2;a++)
for(b=1;b<=2;b++)
for(c=1;c<=2;c++)
for(d=1;d<=2;d++)
for(e=1;e<=2;e++)
for(f=1;f<=2;f++)
for(g=1;g<=2;g++) //每次都有两种可能性共有十五次,2代表遇到店,1代表遇到花
for(h=1;h<=2;h++)
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
for(k=1;k<=2;k++)
for(l=1;l<=2;l++)
for(m=1;m<=2;m++)
for(n=1;n<=2;n++)
{
s[0]=a;
s[1]=b;
s[2]=c;
s[3]=d;
s[4]=e;
s[5]=f;
s[6]=g;
s[7]=h;
s[8]=i; //将每一种可能性都先放在s[]里
s[9]=j;
s[10]=k;
s[11]=l;
s[12]=m;
s[13]=n;
s[14]=1;
sum=0; //每次循环初始化
for(v=0;v<15;v++)
sum=sum+s[v]; //求和
if(sum==20)//筛选出遇到5次店面和10次花,恒等于20
{
r=2;//每次循环酒壶里的酒初始化
for(w=0;w<15;w++)
{
t=s[w];
if(t==2)
r=2*r; //利用循环判断,如果s[]为2,则表示遇到店,否则,则是为1,遇到花;遇到店加倍,遇到花喝一斗
else
r--;
}
if(r==0)//如果酒壶里的酒一滴不剩,则把这种情况输出
{
z++;
for(t=0;t<15;t++)
printf("%d ",s[t]);
printf("\n");
}
}
}
printf("\nz=%d\n",z);//最后输出总的种数
}
2014年第六题奇怪的分式
上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:
1/4 乘以 8/5
小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)
老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!
对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?
请写出所有不同算式的个数(包括题中举例的)。
显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。
但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!
注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。
//a,b,c,d代表原式中的各个字母
#include <stdio.h>
int sum=0;
int main(){
int a,b,c,d;
for(a=1;a<=9;a++){
for(b=1;b<=9;b++){
for(c=1;c<=9;c++){
for(d=1;d<=9;d++){
if(a!=b && c!=d &&(a*c*(b*10+d))==(b*d*(a*10+c))){
sum++;
}
}
}
}
}
printf("%d",sum);
return 0;
}
2015年第一题奖券数目
奖券数目
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。
#include <stdio.h>
int main()
{
int i,j,k,l,m,c=0;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
for(l=0;l<=9;l++)
for(m=0;m<=9;m++)
if(i!=4 && j!=4 && k!=4 && l!=4 && m!=4)
c++;
printf("%d",c);
return 0;
}
2015年第二题星际炸弹
星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。
#include <stdio.h>
int main()
{
int day[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
int y=2014,m=11,d=9,i,r=0;
for(i=0;i<1000;i++)
{
d++;
if((y%4==0 && y%100!=0) || y%400==0)
r=1;
else
r=0;
if(d>day[r][m-1])
{
d=d-day[r][m-1];
m++;
}
if(m>12)
{
y++;
m-=12;
}
}
printf("%d-%02d-%02d",y,m,d);
return 0;
}
2015年第三题三羊生瑞气
三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
+三 羊 献 瑞
三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
#include <stdio.h>
int main()
{
int a,b,c,d,e,f,g,h;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
if(a!=b)
for(c=0;c<=9;c++)
if(a!=c && b!=c )
for(d=0;d<=9;d++)
if(a!=d && b!=d && c!=d)
for(e=1;e<=9;e++)
if(a!=e && b!=e && c!=e && d!=e)
for(f=0;f<=9;f++)
if(a!=f && b!=f && c!=f && d!=f && e!=f)
for(g=0;g<=9;g++)
if(a!=g && b!=g && c!=g && d!=g && e!=g && f!=g )
for(h=0;h<=9;h++)
if(a!=h && b!=h && c!=h && d!=h && e!=h && f!=h && g!=h && a*1000+b*100+c*10+d+e*1000+f*100+g*10+b==e*10000+f*1000+c*100+b*10+h)
printf("%d%d%d%d\n",e,f,g,b);
return 0;
}
2015年第六题加法变乘法
加法变乘法
我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+...+1011+12+...+2728+29+...+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。
#include <stdio.h>
int main()
{
int i,j;
for(i=1;i<=48;i++)
for(j=1;j<=48;j++)
{
if(i*(i+1)+j*(j+1)==2015-1225+2*i+1+2*j+1 && i+2<j && i!=10)
printf("%d",i);
}
return 0;
}
2015年第七题牌型总数
牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
#include <stdio.h>
int main()
{
int sum=0;
int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
for( a0=0;a0<=4;a0++)
for( a1=0;a1<=4;a1++)
for( a2=0;a2<=4;a2++)
for( a3=0;a3<=4;a3++)
for( a4=0;a4<=4;a4++)
for( a5=0;a5<=4;a5++)
for( a6=0;a6<=4;a6++)
for( a7=0;a7<=4;a7++)
for( a8=0;a8<=4;a8++)
for( a9=0;a9<=4;a9++)
for( a10=0;a10<=4;a10++)
for( a11=0;a11<=4;a11++)
for( a12=0;a12<=4;a12++)
if(a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12==13)
sum++;
printf("%d",sum);
return 0;
}
2016年第一题煤球数目
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<stdio.h>
int main()
{
int a[101] ={0},i,j;
for(i = 1 ; i < 101 ; i ++)
a[i] = a[i-1] + i;
int ans = 0;
for(j = 1 ; j < 101 ; j ++)
ans += a[j];
printf("%d\n",ans);
return 0;
}
2016年第二题生日蜡烛
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<stdio.h>
int main()
{
int start,end,i;
for(start = 1 ; start < 236 ; start ++)
{
for( end = start ; end < 236 ; end ++ )
{
int sum = 0;
for(i = start; i <= end; i ++)
sum += i;
if( sum == 236)
{
printf("start : %d end : %d\n",start,end);
}
}
}
return 0;
}
2016年第三题凑算式
凑算式
B DEF
A + --- + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中AI代表19的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
#include<stdio.h>
int main(){
int num=0,a,b,c,d,e,f,g,h,i;
for(a=1;a<=9;a++){
for(b=1;b<=9;b++){
if(b==a)
continue;
for(c=1;c<=9;c++){
if(c==a||c==b)
continue;
for(d=1;d<=9;d++){
if(d==a||d==b||d==c)
continue;
for(e=1;e<=9;e++){
if(e==d||e==c||e==b||e==a)
continue;
for(f=1;f<=9;f++){
if(f==e||f==d||f==c||f==b||f==a)
continue;
for(g=1;g<=9;g++){
if(g==f||g==e||g==d||g==c||g==b||g==a)
continue;
for(h=1;h<=9;h++){
if(h==g||h==f||h==e||h==d||h==c||h==b||h==a)
continue;
for(i=1;i<=9;i++){
if(i==h||i==g||i==f||i==e||i==d||i==c||i==b||i==a)
continue;
int num1=a*c*(g*100+h*10+i);
int num2=b*(g*100+h*10+i);
int num3=c*(d*100+e*10+f);
int num4=10*c*(g*100+h*10+i);
if(num1+num2+num3==num4)
num++;
}
}
}
}
}
}
}
}
}
printf("%d",num);
return 0;
}
2016年第六题方格填数
方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<stdio.h>
int a[10]={0,1,2,3,4,5,6,7,8,9};
int ans=0;
int check(){
if(abs(a[1]-a[0])==1||//abs取绝对值少一半代码量
abs(a[2]-a[1])==1||
abs(a[3]-a[4])==1||
abs(a[4]-a[5])==1||
abs(a[5]-a[6])==1||
abs(a[7]-a[8])==1||
abs(a[8]-a[9])==1|| //左右不相邻
abs(a[3]-a[7])==1||
abs(a[0]-a[4])==1||
abs(a[4]-a[8])==1||
abs(a[1]-a[5])==1||
abs(a[5]-a[9])==1||
abs(a[2]-a[6])==1|| //上下不相邻
abs(a[3]-a[8])==1||
abs(a[9]-a[4])==1||
abs(a[0]-a[5])==1||
abs(a[1]-a[6])==1||
abs(a[0]-a[3])==1||
abs(a[6]-a[9])==1||
abs(a[2]-a[5])==1||
abs(a[1]-a[4])==1||
abs(a[4]-a[7])==1||
abs(a[5]-a[8])==1 //对角不相邻
) return 0;
return 1;
}
void f(int k){
int i;
if(k==10){
if(check()) ans++;
}
for(i=k;i<10;i++){
{int t=a[i];a[i]=a[k];a[k]=t;}
f(k+1);
{int t=a[i];a[i]=a[k];a[k]=t;}
}
}
int main(){
f(0);
printf("%d",ans);
}
2016年第八题四平方和
四平方和
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开
例如,输入:
5
则程序应该输出:
0 0 1 2
再例如,输入:
12
则程序应该输出:
0 2 2 2
再例如,输入:
773535
则程序应该输出:
1 1 267 838
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
#include <stdio.h>
#include <math.h>
int main()
{
int n,i,j,k;
int flag = 0;
scanf("%d",&n);
for(i = 0 ; i * i <= n ; i ++)
{
for(j = 0 ; j * j <= n ; j ++){
for(k = 0 ; k * k <= n ; k ++)
{
int temp = n - i*i - j*j - k*k;
double l = sqrt((double) temp);
if(l == (int)l )
{
printf("%d %d %d %d\n",i,j,k,(int)l);
flag = 1;
break;
}
}
if(flag)break;
}
if(flag)break;
}
return 0;
}
2016年第九题交换瓶子
交换瓶子
有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:
2 1 3 5 4
要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。
输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。
例如,输入:
5
3 1 2 5 4
程序应该输出:
3
再例如,输入:
5
5 4 3 2 1
程序应该输出:
2
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
提交时,注意选择所期望的编译器类型。
#include <stdio.h>
#include <math.h>
int arr[10010];
int flag[10010];
int main()
{
int ans = 0;
int n,i;
scanf("%d",&n);
for(i = 1 ; i <= n ; i ++) scanf("%d",&arr[i]);
for(i = 1 ; i <= n ; i ++ )flag[arr[i]] = i;
for(i = 1 ; i <= n ; i ++)
{
if( i != arr[i] )
{
int x = arr[i];
arr[i] ^= arr[flag[i]] ^= arr[i] ^= arr[flag[i]];
flag[i] ^= flag[x] ^= flag[i] ^= flag[x];
ans ++;
}
}
printf("%d\n",ans);
return 0;
}
2017年第二题等差素数列
标题:等差素数列
2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
#include<stdio.h>
int isPrime(int n) //判断是否为素数
{
if(n == 0 || n == 1)
return 0;
if(n == 2)
return 1;
int i;
for(i = 2; i < n; ++i)
{
if(n % i == 0)
return 0;
}
return 1;
}
int prime[100000]; //用于保存所有素数
int main()
{
int index = 0,i,d;
for(i = 2; i <= 100000; ++i)
{
if(isPrime(i))
{
prime[index] = i; //将素数都保存在prime数组中
index++;
}
}
//对素数数组中的所有数进行枚举
for(i = 0; i <= index; ++i) //i表示素数数组的下标
{
for(d = 3; d <= 500; ++d) //d为公差
{
int j;
//首先判断prime[i]+d是否是素数,如果是,继续判断prime[i]+2*d是否是素数,依次类推,连续10次
for(j = 0; j < 10; ++j)
if(!isPrime(prime[i] + j*d))
break;
if(j == 10)
{
printf("%d\n",d);
return 0;
}
}
}
return 0;
}
2017年第三题承压计算
标题:承压计算
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
请你推算出:读数最大的电子秤的示数为多少?
注意:需要提交的是一个整数,不要填写任何多余的内容。
#include<stdio.h>
double a[30][30]={
{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}
};
int main()
{
int i,j;
double max=0,min=9999999;
for(i=1;i<=29;i++)
for(j=0;j<=i;j++)
{
if(j==0)
a[i][j]+=a[i-1][0]/2.0;
else
{
a[i][j]+=a[i-1][j-1]/2.0+a[i-1][j]/2.0;
}
}
for(i=0;i<=29;i++)
{
if(a[29][i]<min)
min=a[29][i];
if(a[29][i]>max)
max=a[29][i];
}
printf("%lf\n",2086458231/min*max);
return 0;
}
2017年第六题日期问题
标题:日期问题
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入
一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
输入
输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。
样例输入
02/03/04
样例输出
2002-03-04
2004-02-03
2004-03-02
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
#include <stdio.h>
//闰年29天
int isLeap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main()
{
int year, ans = 0;
//闰年的:每年一日到该月13日的天数
int Leap[] = { 12, 31 + 12, 31 + 29 + 12, 31 + 29 + 31 + 12, 31 + 29 + 31 + 30 + 12, 31 + 29 + 31 + 30 + 31 + 12,
31 + 29 + 31 + 30 + 31 + 30 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 12,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 12, 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 12 };
//平年的:每年一日到该月13日的天数
int not_Leap[] = { 12, 31 + 12, 31 + 28 + 12, 31 + 28 + 31 + 12, 31 + 28 + 31 + 30 + 12, 31 + 28 + 31 + 30 + 31 + 12,
31 + 28 + 31 + 30 + 31 + 30 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 12,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 12, 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 12 };
scanf("%d", &year);
int i;
if (isLeap(year))
{
for (i = 0; i < 12; i++)
{
if (((year - 1) * 365 + (year - 1) / 4 - year / 100 + year / 400 + Leap[i] + 1) % 7 == 5) {
printf("%d-%d-13\n", year, i + 1);
ans++;
}
}
}
else
{
for (i = 0; i < 12; i++)
{
if (((year - 1) * 365 + (year) / 4 - year / 100 + year / 400 + not_Leap[i] + 1) % 7 == 5)
{
printf("%d-%d-13\n", year, i + 1);
ans++;
}
}
}
printf("%d\n", ans);
return 0;
}
2018年第一题第几天
标题:第几天
2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第几天?
注意:需要提交的是一个整数,不要填写任何多余内容。
#include<stdio.h>
int main()
{
int year,month,day,i,j;
int count = 0;
int months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
printf("请输入年月日");
scanf("%d%d%d",&year,&month,&day);
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
months[1] = 29;
}
for (i = 0; i < month;i++)
{
for (j = 0; j < months[i];j++)
{
count++;
if (i==month-1&&j==day-1)
{
break;
}
}
}
printf("%d",count);
return 0;
}
2019年第二题年号子串
小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对 应 28,AZ 对应 52,LQ 对应 329。 请问 2019 对应的字符串是什么?
#include <stdio.h>
int main()
{
char a,b,c;
for (a = 'A'; a <= 'Z'; a ++)
for (b = 'A'; b <= 'Z'; b ++)
for (c = 'A'; c <= 'Z'; c ++)
if ((a-'A'+1)*26*26 + (b-'A'+1)*26 + (c-'A'+1) == 2019)
printf("%c %c %c",a,b,c);
return 0;
}
2019年第三题数列求值
【问题描述】 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写 多余的内容将无法得分。
#include <stdio.h>
int a[22000000]={0,1,1,1};
int main()
{
int i;
a[1]=1;a[2]=1;a[3]=1;
for(i=4;i<=20190324;i++)
{
a[i]=(a[i-1]%10000+a[i-2]%10000+a[i-3]%10000)%10000;
}
printf("%d\n",a[20190324]);
return 0;
}
2019年第四题数的分解
【问题描述】 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <stdio.h>
int Check(int num)
{
while(num)
{
if (num % 10 == 2 || num % 10 == 4)
return 0;
num /= 10;
}
return 1;
}
int main()
{
int N = 2019,i,j;
int ans = 0;
for (i = 1; i < N / 3; ++i)
if (Check(i))
for (j = i + 1; N - i - j > j; ++j)
if (Check(j) && Check(N - i - j))
ans++;
printf("%d",ans);
return 0;
}
2019年第六题特别数的和
【问题描述】 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少?
【输入格式】
输入一行包含两个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】 40
【样例输出】 574
【评测用例规模与约定】 对于 20% 的评测用例,1≤n≤10。 对于 50% 的评测用例,1≤n≤100。 对于 80% 的评测用例,1≤n≤1000。 对于所有评测用例,1≤n≤10000。
#include <stdio.h>
int n;
int check(int num)
{
while (num)
{
int a = num % 10;
if (a == 2 || a == 0 || a == 1 || a == 9)
return 0;
num /= 10;
}
return 1;
}
int main()
{
int n,i;
scanf("%d",&n);
long long ans = 0;
for (i = 1; i <= n; i++)
if (!check(i))
ans += i;
printf("%d",ans);
return 0;
}