第七届蓝桥杯决赛题解

平方末尾

能够表示为某个整数的平方的数字称为“平方数”

比如,25,64

虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数。

因为平方数的末位只有可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个。

所以,4325435332必然不是平方数。

如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗?

请计算一下,一个2位以上的平方数的最后两位有多少种可能性?

注意:需要提交的是一个整数,表示2位以上的平方数的最后两位的不同情况数。

不要填写任何多余内容(比如,说明解释文字等)

答案为 22

首先分析题目

很明显 一个数的后二位是有限的对于这类数据规模不大的题目推荐使用暴力的方法 求出答案 下面给出代码

Char n [100] = {0};

For (int j=0;j<99;j++)

Char[j*j%100]=1;

For(int j=0;j<n;j++)

If(a[j])
count++;

Printf(“count”);

 

  

第二个思路仍然是根据每个数的后二位是有限的那么可以对每一个位数进行判断然后排除不可能的数字.

第二个思路的代码如下

For(int j =0;j<100;j++)

If(sovle(j))

Count+++;

Int sovle(int j)

{

             

              If(!(j%10==0||j%10==1||j%10==4||j%10==5||j%10==6||j%10==9))

              Return 0;

              For(int j1=0;j1<100;j1++)

      If(j1*j1%100==j)

      Return 1;

      //很明显这里对上面第一种方法进行重复的计算;我不知道有没有别的方法可以在这里代替这个循环

}

  

下面看第二题

反幻方

我国古籍很早就记载着

2 9 4

7 5 3

6 1 8//幻方

这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。

下面考虑一个相反的问题。

可不可以用 1~9 的数字填入九宫格。

使得:每行每列每个对角线上的数字和都互不相等呢?

这应该能做到。

比如:

9 1 2

8 4 3

7 5 6//

你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。

旋转或镜像算同一种。

比如:

9 1 2

8 4 3

7 5 6

7 8 9

5 4 1

6 3 2

2 1 9

3 4 8

6 5 7

等都算作同一种情况。

请提交三阶反幻方一共多少种。这是一个整数,不要填写任何多余内容。

这种题的第一个难点是生成不重复的0-9数列 而且要以高效的方法

下面给出几种方法

第一使用for循环进行暴力嵌套

For(int j=0;j<10;j++){
    for(int j1=0;j1<10;j1++){
		If(j1!=j){
			for(int j2=0;j2<10;j2++){
				if(j2!=j&&j2!=j1)
					For(int  j=0;j<10;j++){

					//......

				}

                        }

		}
	}

}        

  

上面是一个三层循环的例子 0-9 共需九层循环 此算法的效率接近递归搜索算法但更为耗费时间

下面给出递归深度优先搜索的算法实现

猜你喜欢

转载自www.cnblogs.com/niunaikele/p/10804584.html