2014年蓝桥杯c语言试题及答案
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
例如:
用户输入:
100
程序输出:
11
再例如:
用户输入:
105
程序输出:
6
#include
#define N 9
int num[N] = {1,2,3,4,5,6,7,8,9};
int tag[3][3] = {{4,3,2},{5,3,1},{6,2,1}};
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int go(int i, int n)
{
int a, b, c;
int count = 0;
for (a = 0; a < 3; a++)
{
int r[3] = {0} , d = 0;
for (b = 0; b < 3; b++)
for (c = 0; c < tag[a][b]; c++)
r[b] = r[b] * 10 + num[d++];
if (r[0] + r[1] / r[2] == n && r[1] % r[2] == 0) count++;
if (r[0] + r[2] / r[1] == n && r[2] % r[1] == 0) count++;
if (r[1] + r[0] / r[2] == n && r[0] % r[2] == 0) count++;
if (r[1] + r[2] / r[0] == n && r[2] % r[0] == 0) count++;
if (r[2] + r[0] / r[1] == n && r[0] % r[1] == 0) count++;
if (r[2] + r[1] / r[0] == n && r[1] % r[0] == 0) count++;
}
while (i < N)
{
int k = i + 1;
while (k < N)
{
swap(num + i, num + k);
count += go(i + 1, n);
swap(num + i, num + k);
k++;
}
i++;
}
return count;
}
int main()
{
int n;
scanf("%d", &n);
printf("%d", go(0, n));
return 0;
}
10. 标题:剪格子
如图p1.jpg所示,3 x 3 的格子中填写了一些整数。
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0
程序输入输出格式要求:
程序先读入两个整数 m n 用空格分割 (m,n<10)
表示表格的宽度和高度
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000
程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。
例如:
用户输入:
3 3
10 1 52
20 30 1
1 2 3
则程序输出:
3
再例如:
用户输入:
4 3
1 1 1 1
1 30 80 2
1 1 1 100
则程序输出:
10
#include
#define N 10
int num[N][N];
int tag[N][N] = {0};
int m, n;
int r = 100;
int find(int i, int j, int t, int ntag[][N])
{
int count = 0;
if (i < 0 || i >= n || j < 0 || j >= m || ntag[i][j] == 1)
return 0;
ntag[i][j] = 1;
if (tag[i][j] != t)
return 0;
count++;
count += find(i - 1, j, t, ntag);
count += find(i + 1, j, t, ntag);
count += find(i, j - 1, t, ntag);
count += find(i, j + 1, t, ntag);
return count;
}
int isbad()
{
int i, j, k = 0;
int t = tag[0][0];
int ntag1[N][N] = {0};
int ntag2[N][N] = {0};
int ge1 = find(0, 0, t, ntag1);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (tag[i][j] != t)
{
k = 1;
break;
}
}
if (k == 1)
break;
}
if (i == n && j == m)
return 0;
int ge2 = find(i, j, tag[i][j], ntag2);
return ge1 + ge2 != m * n;
}
int bad(int i, int j)
{
if (i < 0 || i >= n || j < 0 || j >= m || tag[i][j] == 1)
return 1;
tag[i][j] = 1;
int b = isbad();
tag[i][j] = 0;
return b;
}
void go(int i, int j, int k, int count)