2016第七屆藍橋杯省賽C組試題及部分答案
阿新 • • 發佈:2019-01-02
答案都是自己理解的
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這個高度。輸入格式:一個正整數N(N<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號北大決賽,也算公費旅遊)