蓝桥杯历年穷举题

蓝桥杯历年穷举题

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的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

img

#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;
}
posted @ 2020-04-20 17:37  insist钢  阅读(234)  评论(0编辑  收藏  举报