2013蓝桥杯C/C++程序设计本科A组


1. 高斯日记

    大数学家高斯有个好习惯:无论如何都要记日记。

    他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

    后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

    高斯出生于:1777年4月30日。
    
    在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

    高斯获得博士学位的那天日记上标着:8113   

    请你算出高斯获得博士学位的年月日。

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

请严格按照格式,通过浏览器提交答案。

注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。


思路:这题可以不用写代码,直接可以算出来,答案是:1799-07-16


2.排它平方数

小明正看着 203879 这个数字发呆。

    原来,203879 * 203879 = 41566646641

    这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

    具有这样特点的6位数还有一个,请你找出它!

    再归纳一下筛选要求:
    1. 6位正整数
    2. 每个数位上的数字不同
    3. 其平方数的每个数位不含原数字的任何组成数位

答案是一个6位的正整数。

请通过浏览器提交答案。
注意:只提交另一6位数,题中已经给出的这个不要提交。
注意:不要书写其它的内容(比如:说明性的文字)。

思路:六位数的平方超出了int32和long的范围,所以我这里直接用一个20位的数组来存放num*num的结果,算法就是模拟连小学生都会的错位相加法。其次是判断i各个位上的数字是否相同,这里我用一个长度为10的数组n,i中出现的数字作为数组下标,然后遍历i的每一位wei进行n[wei]++操作,最后判断n中的值是否都为0 或1即可。

#include<stdio.h>
int n[10];
int cj[20];//
int isDifferent(int num)//判断每位是否不同
{
	int ok =1;
	do
	{
		n[num%10]++;
	}while((num/=10)!=0);
	for(int i=0;i<10;i++)  
		if(n[i]!=0&&n[i]!=1)  
		{  
			ok = 0;  
			break;  
		}  
		return ok;  
}
void init()  
{  
	int i;
	for(i=0;i<10;i++)   
	{  
		n[i]=0;  
	}  
	for(i=0;i<20;i++)   
	{  
		cj[i]=0;  
	}  
}  
int main()
{
	for(int num=123456;num<987655;num++)
	{		
		if(isDifferent(num)) 
		{
			int temp=num;
			for(int i=0;i<6;i++)
			{
				int mul=(temp%10)*num;
				int index=i;
				do
				{
					cj[index]+=mul%10;
					if(cj[index]>=10)
					{
						cj[index+1]+=cj[index]/10;
					}
					cj[index]%=10;
					index++;
				}while((mul/=10)!=0);
				temp/=10;
			}
			int ok=1,m;
			for(m=19;cj[m]==0;m--)
				;
			for(;m>=0;m--)
			{
				for(int j=0;j<10;j++)
				{
					if(cj[m]==j&&n[j]==1)
						ok=0;
				}
			}
			if(ok)
			{
				printf("%d\n",num);
			}
		}
		init();
	}
	return 0;
}

答案:639172




3.振兴中华

小明参加了学校的趣味运动会,其中的一个项目是:跳格子。

    地上画着一些格子,每个格子里写一个字,如下所示:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值