您的位置:首页 > 编程语言 > C语言/C++

2016第七届蓝桥杯省赛C组试题及部分答案

2016-05-18 15:35 531 查看
答案都是自己理解的

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
);
return 0;
}


PS 自从工作之后,几乎没个人时间,这个博客也有半年没更新了。我想我必须每天都学习新的知识了!(28号北大决赛,也算公费旅游)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 蓝桥杯 2016省赛