1. 程式人生 > >2016第七屆藍橋杯省賽C組試題及部分答案

2016第七屆藍橋杯省賽C組試題及部分答案

答案都是自己理解的

1.報紙頁數

X星球日報和我們地球的城市早報是一樣的,都是一些單獨的紙張疊在一起而已。每張紙印有4版。比如,某張報紙包含的4頁是:5,6,11,12可以確定它應該是最上邊的第2張報紙。我們在太空中撿到了一張X星球的報紙,4個頁碼分別是:
1125,1126,1727,1728

請你計算這份報紙一共多少頁(也就是最大頁碼,並不是用了幾張紙哦)?請填寫表示總頁數的數字。

注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。

/************************************************************************/
/* 報紙頁數	
 * 寫完之後用例題資料測了下就提交了
 */
/************************************************************************/
#include <stdio.h>

int main()
{
	int a, b, c, d;
	scanf("%d%d%d%d", &a, &b, &c, &d);
	//上面*張 下面*張 共*張 共*頁
	printf("%d %d %d %d\n", (c - b) / 4, b / 2, (c - b) / 4 + b / 2, ((c - b) / 4 + b / 2)*4);
	return 0;
}

2.煤球數目有一堆煤球,堆成三角稜錐形。具體:第一層放1個,第二層3個(排列成三角形),第三層6個(排列成三角形),第四層10個(排列成三角形),
....

如果一共有100層,共有多少個煤球?請填表示煤球總數目的數字。注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。
/************************************************************************/
/* 煤球數目
 * 剛開始一直在想象著它是怎麼擺放的,然並卵,想不出來,最後直接用了個公式
 */
/************************************************************************/
#include <stdio.h>

int main()
{
	int i,n,sum;
	
	sum = 0;
	n = 0;
	for (i = 1; i <= 100; ++i)
	{
		n +=i;
		sum += n;
		printf("%d\n", n);
	}
	printf("%d\n", sum);
	return 0;
}

3.平方怪圈
如果把一個正整數的每一位都平方後再求和,得到一個新的正整數。對新產生的正整數再做同樣的處理。如此一來,你會發現,不管開始取的是什麼數字,最終如果不是落入1,就是落入同一個迴圈圈。請寫出這個迴圈圈中最大的那個數字。請填寫該最大數字。注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。
/************************************************************************/
/* 平方怪圈
 *  我隨機輸了個數字,跑出100個結果,很明顯的迴圈。。。
 */
/************************************************************************/
#include <stdio.h>

int main()
{
        int i,j,n,sum;
        
        scanf("%d", &n);
        for (i = 1; i < 100;i++)
        {
                sum = 0;
                while (n)
                {
                        j = n % 10;
                        sum += j*j;
                        n /= 10;
                }
                n = sum;
                printf("%d\n", sum);
        }
        
        return 0;
}

4和5略過

6.15
湊算式

B DEF

A + --- + ------- = 10
C GHI

(如果顯示有問題,可以參見【圖1.jpg】)這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。比如:
6+8/3+952/714 
就是一種解法,
5+3/1+972/486 
是另一種解法。這個算式一共有多少種解法?注意:你提交應該是個整數,不要填寫任何多餘的內容或說明性文字。

/************************************************************************/
/* 湊算式
*  暴搜+剪枝
*/
/************************************************************************/

#include<stdio.h>

int a[10], b, c, sum = 0;
bool isVisit[10];

void dfs(int num)
{
	if (10==num)
	{
		b = a[2] * (a[7] * 100 + a[8] * 10 + a[9]);                       //通分
		c = a[3] * (a[4] * 100 + a[5] * 10 + a[6]);
		if (0==(b + c) % (a[3] * (a[7] * 100 + a[8] * 10 + a[9])))           //判斷後兩個數相加是否為整數
		{
			if (10==a[1] + (b + c) / (a[3] * (a[7] * 100 + a[8] * 10 + a[9]))) //判斷三個數相加是否為10
				sum++;
		}
	}
	for (int i = 1; i < 10; i++)
	{
		if (isVisit[i] == 0)
		{
			isVisit[i] = 1;
			a[num] = i;
			dfs(num + 1);
			isVisit[i] = 0;
		}
	}
}
int main()
{
	dfs(1);
	printf("%d\n", sum);
	return 0;
}

7.19
寒假作業
現在小學的數學題目也不是那麼好玩的。看看這個寒假作業:

□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □

(
如果顯示不出來,可以參見【圖1.jpg)

每個方塊代表1~13中的某一個數字,但不能重複。比如:


6 + 7 = 13


9 - 8 = 1 3 * 4 = 12


10 / 2 = 5
以及:


7 + 6 = 13


9 - 8 = 1

3 * 4 = 12

10 / 2 = 5
就算兩種解法。(加法,乘法交換律後算不同的方案)你一共找到了多少種方案?
請填寫表示方案數目的整數。注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。
/************************************************************************/
/* 寒假作業
* 暴搜+剪枝
*/
/************************************************************************/

#include<stdio.h>

int a[14], b, c, sum = 0;
bool isVisit[14];

bool test(int next)
{
	if (3 == next)
	{
		if (a[1] + a[2] != a[3])
		{
			return false;
		}
	}
	if (6 == next)
	{
		if (a[4] - a[5] != a[6])
		{
			return false;
		}
	}
	if (9 == next)
	{
		if (a[7] * a[8] != a[9])
		{
			return false;
		}
	}
	if (12 == next)
	{
		if (a[10] / a[11] != a[12] || a[10] % a[11] != 0)
		{
			return false;
		}
	}

	return true;
}

void dfs(int num)
{
	if (13 == num)
	{
		if ((a[3] == a[1] + a[2]) && (a[6] == a[4] - a[5]) && (a[9] == a[7] * a[8]) && (a[12] == a[10] / a[11]))
		{
			sum++;
		}
	}

	for (int i = 1; i <= 13; i++)
	{
		if (isVisit[i] == 0)
		{
			isVisit[i] = 1;
			a[num] = i;

			if (!test(num))
			{
				isVisit[i] = 0;
				continue;
			}

			dfs(num + 1);
			isVisit[i] = 0;
		}
	}
}
int main()
{
	dfs(1);
	printf("%d\n", sum);
	return 0;
}


8.21
冰雹數
任意給定一個正整數N如果是偶數,執行: N / 2如果是奇數,執行: N * 3 + 1生成的新的數字再執行同樣的動作,迴圈往復。通過觀察發現,這個數字會一會兒上升到很高,一會兒又降落下來。就這樣起起落落的,但最終必會落到“1”這有點像小冰雹粒子在冰雹雲中翻滾增長的樣子。比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1

可以看到,N=9的時候,這個小冰雹最高衝到了52這個高度。輸入格式:一個正整數NN<1000000輸出格式:一個正整數,表示不大於N的數字,經過冰雹數變換過程中,最高衝到了多少。例如,輸入:
10

程式應該輸出:
52


再例如,輸入:
100

程式應該輸出:
9232

/************************************************************************/
/* 冰雹數
 *
 */
/************************************************************************/

#include<stdio.h>

int ans[1000000],i,t_max;

int next(int num)
{
	t_max = num;
	while (1 != num)
	{
		while (0 == num % 2)
		{
			num /= 2;
		}
		if (1==num)
		{
			break;
		}
		num = num * 3 + 1;
		if (num>t_max)
		{
			t_max = num;
		}
	}
	return t_max;
}

void offLine() 
{
	for (i = 2; i < 500000; i++)
	{
		ans[i] = next(i);
		if (ans[i] < ans[i - 1])
		{
			ans[i] = ans[i - 1];
		}
		printf("%d  %d\n",i, ans[i]);
	}
}
int main() 
{
	int n;

	offLine();

	scanf("%d", &n);

	printf("%d\n", ans[n]);
	return 0;
}


PS 自從工作之後,幾乎沒個人時間,這個部落格也有半年沒更新了。我想我必須每天都學習新的知識了!(28號北大決賽,也算公費旅遊)