文章预览:
集中了很多的面试题以及竞赛题的C语言解法供大家参考学习,以下代码运行环境为vs2013,建议大家收藏,顺便点赞给个好评吧~~
1.01字串
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:0000 0001 0010 0011 0010…
#include <stdio.h>
#include <windows.h>
int main(){
int i, j, k, l, m;
for (i = 0; i <= 1; ++i)
for (j = 0; j <= 1; ++j)
for (k = 0; k <= 1; ++k)
for (l = 0; l <= 1; ++l)
for (m = 0; m <= 1; ++m)
printf("%d%d%d%d%d\n", i, j, k, l, m);
system("pause");
return 0;
}
2.2N皇后问题
问题描述:
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式:
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式:
输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
int a[9][9], n, sum;
int row1[9], diagl1[17], diagr1[17], row2[9], diagl2[17], diagr2[17];
void dfs2(int i)
{
int j;
if (i == n + 1)
{
sum++;
return;
}
for (j = 1; j <= n; j++)
{
if (a[i][j] == 1 && row2[j] != 0 && diagl2[n - i + j] != 0 && diagr2[i + j] != 0)
{
a[i][j] = 0;
row2[j] = 0;
diagl2[n - i + j] = 0;
diagr2[i + j] = 0;
dfs2(i + 1);
row2[j] = 1;
diagl2[n - i + j] = 1;
diagr2[i + j] = 1;
a[i][j] = 1;
}
}
}
void dfs1(int i)
{
int j, h, r;
if (i == n + 1)
{
for (h = 1, r = 1; r <= n; r++)
{
if (a[1][r] == 1)
{
a[1][r] = 0;
row2[r] = 0;
diagl2[n - h + r] = 0;
diagr2[h + r] = 0;
dfs2(h + 1);
row2[r] = 1;
diagl2[n - h + r] = 1;
diagr2[h + r] = 1;
a[1][r] = 1;
}
}
}
for (j = 1; j <= n; j++)
{
if (a[i][j] == 1 && row1[j] != 0 && diagl1[n - i + j] != 0 && diagr1[i + j] != 0)
{
a[i][j] = 0;
row1[j] = 0;
diagl1[n - i + j] = 0;
diagr1[i + j] = 0;
dfs1(i + 1);
row1[j] = 1;
diagl1[n - i + j] = 1;
diagr1[i + j] = 1;
a[i][j] = 1;
}
}
}
int main()
{
int i, j;
while (scanf("%d", &n) != EOF)
{
sum = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
for (i = 1; i <= n; i++)
row1[i] = row2[i] = 1;
for (i = 1; i <= 2 * n; i++)
diagl1[i] = diagr1[i] = diagl2[i] = diagr2[i] = 1;
for (i = 1, j = 1; j <= n; j++)
{
if (a[1][j] == 1)
{
a[1][j] = 0;
row1[j] = 0;
diagl1[n - i + j] = 0;
diagr1[i + j] = 0;
dfs1(i + 1);
row1[j] = 1;
diagl1[n - i + j] = 1;
diagr1[i + j] = 1;
a[1][j] = 1;
}
}
printf("%d\n", sum);
}
system("pause");
return 0;
}
3.Fibonacci数列
问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。1 <= n <= 1,000,000。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
样例输入
10
样例输出
55
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#define MOD 10007
#define MAXN 1000001
int n, i, F[MAXN];
int main()
{
scanf("%d", &n);
F[1] = 1;
F[2] = 1;
for (i = 3; i <= n; ++i)
F[i] = (F[i - 1] + F[i - 2]) % MOD;
printf("%d\n", F[n]);
system("pause");
return 0;
}
4.字符串的规律
问题描述
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?
输入格式
仅有一个数:N ≤ 26。
输出格式
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
ABACABA
#include <windows.h>
#include <stdio.h>
void f(int a)
{
if (a == 0)printf("%c", 'A');
else
{
f(a - 1);
printf("%c", a + 'A');
f(a - 1);
}
}
int main()
{
int a; scanf("%d", &a); f(a - 1); printf("\n");
system("pause");
return 0;
}
5.Huffman数
问题描述
Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa +pb。
2. 重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
输入格式
输入的第一行包含一个正整数n(n<=100)。
接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
输出格式 输出用这些数构造Huffman树的总费用。
样例输入
5 5 3 8 2 9
样例输出
59
#include <windows.h>
#include <stdio.h>
typedef struct
{
int a[100];
int len;
}huf;
int sum = 0;
int del(huf* in, int t)
{
int i;
for (i = 0; i<in->len && in->a[i] != t; i++);
for (; i<in->len - 1; i++)
in->a[i] = in->a[i + 1];
in->len--;
return 1;
}
int add(huf* in, int t)
{
in->a[in->len] = t;
in->len++;
return 1;
}
int find_two_mins(huf* in)
{
int i, j, t;
int mina, minb;
for (i = 0; i<in->len - 1; i++)
for (j = i + 1; j<in->len; j++)
if (in->a[i]>in->a[j])
{
t = in->a[i];
in->a[i] = in->a[j];
in->a[j] = t;
}
mina = in->a[0];
minb = in->a[1];
del(in, mina);
del(in, minb);
add(in, mina + minb);
return mina + minb;
}
int main()
{
huf in;
int i, n;
scanf("%d", &n);
in.len = n;
for (i = 0; i<n; i++)
scanf("%d", &in.a[i]);
while (1)
{
if (in.len == 2)
{
sum = sum + in.a[0] + in.a[1];
break;
}
sum += find_two_mins(&in);
}
printf("%d", sum);
system("pause");
return 0;
}
6.sine之舞
问题描述
最近开设了数学分析课,若要学好这门课,必须有一个好的三角函数基本功。所以做了一个“Sine之舞”的游戏,寓教于乐,提高计算能力。
不妨设
An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
计算Sn的值,打印出Sn的完整表达式,以做题。
输入格式
仅有一个数:N<201。
输出格式
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1
#include <windows.h>
#include <stdio.h>
void printA(int n, int k)
{
if (n == k)
printf("sin(%d)", n);
else
{
printf("sin(%d", n);
printf(n % 2 == 0 ? "+" : "-");
printA(n + 1, k);
printf(")");
}
}
void printS(int n, int k)
{
if (n == 1)
{
printA(1, n);
printf("+%d", k - n);
}
else
{
printf("(");
printS(n - 1, k);
printf(")");
printA(1, n);
printf("+%d", k - n);
}
}
int main()
{
int N;
scanf("%d", &N);
printS(N, N + 1);
printf("\n");
system("pause");
return 0;
}
7.报时助手
问题描述
给定当前的时间,请用英文的读法将它读出来。
时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“three o’clock”。
如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
时和分的读法使用的是英文数字的读法,其中0~20读作:
0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen, 14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen, 20:twenty。
30读作thirty,40读作forty,50读作fifty。
对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty one”。
按上面的规则21:54读作“twenty one fifty four”,9:07读作“nine seven”,0:15读作“zero fifteen”。
输入格式
输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。
输出格式
输出时间时刻的英文。
样例输入
0 15
样例输出
zero fifteen
#include<windows.h>
#include<stdio.h>
#include<string.h>
int main()
{
int h, m;
char g[50][50] = {
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty" };
char s[10][10] = {
"twenty", "thirty", "forty", "fifty" };
scanf("%d%d", &h, &m);
if (m == 0)if (h < 21)printf("%s o'clock", g[h]); else {
printf("%s %s o'clock", s[h / 10 - 2], g[h % 10]); }
else {
if (h < 21)printf("%s ", g[h]); else {
printf("%s %s ", s[h / 10 - 2], g[h % 10]); }
if (m < 21)printf("%s ", g[m]); else {
printf("%s %s ", s[m / 10 - 2], g[m % 10]); }
}
printf("\n");
system("pause");
return 0;
}
8.查找整数
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
输入格式
第一行包含一个整数n。1 <= n <= 1000。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
#include<windows.h>
#include <stdio.h>
#define MAXN 10001
int n, a, ans;
int s[MAXN];
int main()
{
int i;
scanf("%d", &n);
for (i = 0; i < n; ++i)
scanf("%d", &s[i]);
scanf("%d", &a);
ans = -1;
for (i = 0; i < n; ++i)
{
if (s[i] == a)
{
ans = i + 1;
break;
}
}
printf("%d", ans);
system("pause");
return 0;
}
9.分解质因数
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。2<=a<=b<=10000
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
提示
先筛出所有素数,然后再分解。
#include<windows.h>
#include<stdio.h>
#include<math.h>
int main()
{
long int b, k, m, n,i, w = 0;
scanf("%ld%ld", &m, &n);
for (i = m; i <= n; i++)
{
printf("%ld=", i);
b = i; k = 2;
while (k <= sqrt((double)i))
{
if (b%k == 0)
{
b = b / k;
if (b>1)
{
printf("%ld*", k); continue;
}
if (b == 1) printf("%ld\n", k);
}
k++;
}
if (b>1 && b<i) printf("%ld\n", b);
if (b == i)
{
printf("%d\n", i); w++;
}
}
system("pause");
return 0;
}
10.龟兔赛跑
问题描述
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——******计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入
10 5 5 2 20
样例输出
D
4
#include<windows.h>
#include<stdio.h>
int main()
{
int v1, v2, t, s, l, s1 = 0, s2 = 0, i = 0;
scanf("%d %d %d %d %d", &v1, &v2, &t, &s, &l);
while (s1<l&&s2<l)
{
s1 += v1;
s2 += v2;
i++;
if (s1 == l || s2 == l)break;
if (s1 - s2 >= t)s1 -= v1*s;
}
if (s1>s2) printf("R\n");
else if (s2>s1) printf("T\n");
else printf("D\n");
printf("%d", i);
system("pause");
return 0;
}
11.回型取数
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
#include <stdio.h>
#include<windows.h>
#include <string.h>
#define MAX_N 200
int m, n;
int a[MAX_N][MAX_N], b[MAX_N][MAX_N];
int s = 0;
void solve(int i, int j)
{
if (i<m && i >= 0 && j<n && j >= 0 && b[i][j] == 0)
{
printf("%d ", a[i][j]);
b[i][j] = 1;
}
else
{
s++;
return;
}
if (s % 4 == 0)
solve(i + 1, j);
if (s % 4 == 1)
solve(i, j + 1);
if (s % 4 == 2)
solve(i - 1, j);
if (s % 4 == 3)
solve(i, j - 1);
if (s % 4 == 0)
solve(i + 1, j);
if (s % 4 == 1)
solve(i, j + 1);
if (s % 4 == 2)
solve(i - 1, j);
if (s % 4 == 3)
solve(i, j - 1);
return;
}
int main()
{
memset(b, 0, sizeof(b));
scanf("%d%d", &m, &n);
int i, j;
for (i = 0; i<m; i++)
for (j = 0; j<n; j++)
scanf("%d", &a[i][j]);
solve(0, 0);
puts("");
system("pause");
return 0;
}
12.阶乘计算
问题描述
输入一个正整数n,输出n!的值。
其中n!=123*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!的准确值。
样例输入
10
样例输出
3628800
#include<windows.h>
#include <stdio.h>
#define N 10000
int main()
{
int a[N] = {
1 };
int k = 0, l = 1, n;
int i, j;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
for (j = 0; j<l; j++)
{
a[j] = a[j] * i + k;
k = a[j] / 10000;
a[j] = a[j] % 10000;
}
if (k)
{
a[j] = k;
l++;
k = 0;
}
}
printf("%d", a[l - 1]);
for (i = l - 2; i >= 0; i--)
printf("%04d", a[i]);
printf("\n");
system("pause");
return 0;
}
13.矩形面积交
问题描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
#include <stdio.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
int main()
{
double x1,y1,x2,y2;//矩形1
double x3,y3,x4,y4;//矩形2
double m1,n1;//交集左上角坐标
double m2,n2;//交集右下角坐标
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
scanf("%lf%lf%lf%lf",&x3,&y3,&x4,&y4);
m1=max(min(x1,x2),min(x3,x4));
n1=max(min(y1,y2),min(y3,y4));
m2=min(max(x1,x2),max(x3,x4));
n2=min(max(y1,y2),max(y3,y4));
if(m2>m1&&n2>n1)
printf("%.2f\n",(m2-m1)*(n2-n1));
else
printf("0.00\n");
return 0;
}
13.矩阵乘法
问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
#include <stdio.h>
#include <string.h>
#include<windows.h>
#define N 100
int A[N][N],t[N][N],r[N][N];
int main()
{
int n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&A[i][j]);
for(i=0;i<n;i++)
r[i][i]=1;//单位矩阵,如同数的乘法中的1
while(m--)
{
memset(t,0,sizeof(t));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
t[i][j]+=r[i][k]*A[k][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
r[i][j]=t[i][j];
}
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
printf("%d ",r[i][j]);
printf("%d\n",r[i][j]);
}
system("pause");
return 0;
}
14.闰年判断
问题描述
给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年。
年份是4的倍数而不是100的倍数;
年份是400的倍数。
其他的年份都不是闰年。
输入格式
输入包含一个整数y,表示当前的年份。
输出格式
输出一行,如果给定的年份是闰年,则输出yes,否则输出no。
说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。
样例输入
2013
样例输出
no
#include <stdio.h>
int main()
{
int y;
scanf("%d", &y);
if (y%4==0 && y%100!=0 || y%400==0)
printf("yes");
else
printf("no");
return 0;
}
15.完美的代价
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
#include<windows.h>
#include <stdio.h>
int changes(char s[], char x, int n);
char x = '0';
int main(void)
{
int n, i, k = 0, b[26] = {
0 }, j;
char y, s[8000] = {
0 };
scanf("%d", &n);
getchar();
for (i = 0; i<n; i++)
scanf("%c", &s[i]);
for (i = 0; i<n; i++)
{
j = s[i] - 'a';
b[j]++;
}
for (j = 0; j<26; j++)
{
if (b[j] % 2 != 0)
{
k++;
x = j + 'a';
}
}
if (k >= 2)
printf("Impossible\n");
else
printf("%d\n", changes(s, x, n));
system("pause");
return 0;
}
int changes(char s[], char x, int n)
{
int i, change = 0, j, k;
for (i = 0; i<n / 2; i++)
{
if (s[i] == x)
{
for (j = i; j<n - i - 1; j++)
if (s[n - i - 1] == s[j])
break;
change += j - i;
for (k = j; k>i; k--)
s[k] = s[k - 1];
s[i] = s[n - i - 1];
}
else
{
for (j = n - i - 1; j >= i; j--)
if (s[i] == s[j])
break;
change += n - i - 1 - j;
for (k = j; k<n - i - 1; k++)
s[k] = s[k + 1];
s[n - i - 1] = s[i];
}
}
return change;
}
16.芯片测试
问题描述
有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
给出所有芯片的测试结果,问哪些芯片是好芯片。
输入格式
输入数据第一行为一个整数n,表示芯片个数。
第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。
输出格式
按从小到大的顺序输出所有好芯片的编号
样例输入
3
1 0 1
0 1 0
1 0 1
样例输出
1 3
#include<windows.h>
#include<stdio.h>
#include<string.h>
int main()
{
int a[50][50];int i,j,n,s;scanf("%d",&n);
for(j=0;j<n;j++)for(i=0;i<n;i++)scanf("%d",&a[i][j]);
for(j=0;j<n;j++){
s=0;for(i=0;i<n;i++)s=s+a[j][i];if(s>n/2.0)printf("%d ",j+1);}
system("pause");
return 0;
}
17.杨辉三角
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
输入格式
输入包含一个数n。1 <= n <= 34。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
#include<windows.h>
#include <stdio.h>
#define MAXN 40
int n;
int a[MAXN][MAXN];
int main()
{
int i, j;
scanf("%d", &n);
a[0][0] = 1;
for (i = 0; i < n; ++i)
{
a[i][0] = a[i][i] = 1;
for (j = 1; j < i; ++j)
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
for (i = 0; i < n; ++i)
{
for (j = 0; j <= i; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
system("pause");
return 0;
}
18.找凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
int main()
{
int murder[4] = {
0 };
int i;
for (i = 0; i < 4; i++) //遍历假设四个人中的某个人是凶手
{
murder[i] = 1; //假设某个人是凶手
if ((murder[0] != 1) +
(murder[2] == 1) +
(murder[3] == 1) +
(murder[3] != 1) == 3)
{
break; //满足就代表就是你了!
}
murder[i] = 0; //不满足还他清白
}
putchar('A' + i); //打印凶手的编号。我们的编号是0 1 2 3,加上'A'后变成A B C D。
system("pause"); // 暂停等待
return 0;
}
19.拿糖果
问题描述
妈妈给小B买了N块糖!但是她不允许小B直接吃掉。
假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数。这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走P块糖。然后小B就可以接着拿糖。
现在小B希望知道最多可以拿多少糖。
输入格式
一个整数N
输出格式
最多可以拿多少糖
样例输入
15
样例输出
6
#include<stdio.h>
#include<math.h>
#include<windows.h>
int f1(int m)
{
int i = 0;
for (i = 2; i<sqrt((double)m); i++)
{
if (m%i == 0)return 0;
}
return 1;
}
int f(int x)
{
int m = sqrt((double)x);
int i = 0;
while (m >= 2)
{
if (f1(m))
{
return f(x - m * 2) + m;
}
else
m--;
}
return 0;
}
int main()
{
int x;
int m;
scanf("%d", &x);
m = f(x);
printf("%d", m);
system("pause");
return 0;
}
20.学霸的迷宫
问题描述
学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式
第一行两个整数n, m,为迷宫的长宽。
接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
输出格式
第一行一个数为需要的最少步数K。
第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
样例输入
Input Sample 1:
3 3
001
100
110
Input Sample 2:
3 3
000
000
000
样例输出
Output Sample 1:
4
RDRD
Output Sample 2:
4
DDRR
#include <stdio.h>
#include <string.h>
struct node{
int x;
int y;
int s;
int d;
int p;
};
int main(){
char map[501][501], path[2500] = "";
int book[501][501] = {
0};
int n, m, head = 1, tail = 1, flag = 0;
struct node que[2501];
int next[4][3] = {
{
-1, 0, 'U'},//上U
{
1, 0, 'D'},//下D
{
0, -1, 'L'},//左L
{
0, 1, 'R'}//右R
};
int i, j,tx, ty;
scanf("%d %d", &n, &m);
for(i = 0; i < n; i++){
scanf("%s", map[i]);
}
que[tail].x = 1;
que[tail].y = 1;
que[tail].s = 0;
que[tail].p = 0;
tail++;
book[1][1] = 1;
while(head < tail){
if(flag){
break;
}
for(i = 0; i < 4; i++){
tx = que[head].x + next[i][0];
ty = que[head].y + next[i][1];
if(tx < 1 || ty < 1 || tx > n || ty > m){
continue;
}
if(book[tx][ty] == 0 && map[tx - 1][ty - 1] == '0'){
book[tx][ty] = 1;
que[tail].x = tx;
que[tail].y = ty;
que[tail].s = que[head].s + 1;
que[tail].d = next[i][2];
que[tail].p = head;
tail++;
}
if(tx == n && ty == m){
flag = 1;
break;
}
}
head++;
}
i = tail - 1;
j = 0;
while(que[i].p != 0){
path[j++] = que[i].d;
i = que[i].p;
}
printf("%d\n", que[tail - 1].s);
for(j--; j >= 0; j--){
printf("%c", path[j]);
}
return 0;
}
更多的题型以后还会发噢,建议收藏起来~~~