*c语言*这些问题你能解决吗?

集中了很多的面试题以及竞赛题的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=2
3
7=7
8=222
9=33
10=2
5
提示
  先筛出所有素数,然后再分解。

#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;
}

更多的题型以后还会发噢,建议收藏起来~~~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_58103115/article/details/120765972