C语言练习题
17.排序名单(字典)
学习了字典序和字符串比较之后,今天让我们来给学生名单进行一下排序。我们知道计算理工学院的每个精英班有 10 名学生,老师会依次给出 10 名学生的名字(均为不含有空格的英文字符串)。你需要将这些名字按照字典序从小到大进行输出。
输入格式
测评机会反复运行你的程序。每次程序运行时,你的程序会被输入10行不含有空格的字符串,分别对应十个学生的姓名(字符串长度均大于 0且小于 20)。
输出格式
输出为10行,为排序后的 10个学生姓名,每个学生姓名单独占一行。
样例输入
Alice
Bob
Gary
Harry
Ivn
Julia
Danis
Fone
Candy
Evan
样例输出
Alice
Bob
Candy
Danis
Evan
Fone
Gary
Harry
Ivn
Julia
完整代码:
#include <stdio.h>
int main() {
int i,j;
char name[10][21];
char temp[21];
for (i = 0; i < 10 ;i++) {
scanf("%s",&name[i]);
//printf("%s\n",name[i]);
}
for (i = 0; i < 10 ; i++) {
for(j = i + 1; j < 10; j++){
if(strcmp(name[i], name[j]) > 0) {
strcpy(temp, name[i]);
strcpy(name[i], name[j]);
strcpy(name[j], temp);
}
}
}
for (i = 0; i < 10; i++) {
printf("%s\n",name[i]);
}
return 0;
}
18.矩阵翻转输出
题目描述:
输入格式:
输出格式:
输出包括 m 行,每行包含 n 个整数,按要求输出翻转后的矩阵,每行任意两个整数之间用一个空格分隔,每行最后一个整数后面没有空格。
样例输入1:
2 3
1 2 3
3 4 6
1
1234
样例输出1
3 2 1
6 4 3
12
样例输入2
3 2
1 2
3 4
5 6
0
12345
样例输出2
5 6
3 4
1 2
完整代码:
#include <stdio.h>
int main() {
int matrix[100][100];
int m;
int n;
int choice;
int i,j;
scanf("%d %d\n",&m,&n);
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
scanf("%d ",&matrix[i][j]);
}
scanf("\n");
}
scanf("%d\n",&choice);
if(choice == 0){
for( i = 0; i< m/2; i++){
for( j = 0; j < n; j++){
int temp = matrix[i][j];
matrix[i][j] = matrix[m-1-i][j];
matrix[m-1-i][j] = temp;
}
}
}
if(choice == 1){
for( i = 0; i < m; i++){
for( j = 0; j <n/2; j++){
int temp = matrix[i][j];
matrix[i][j] = matrix [i][n-1-j];
matrix[i][n-1-j] = temp;
}
}
}
for( i = 0; i < m; i++){
for( j = 0; j < n; j++){
printf("%d",matrix[i][j]);
if(j!=n-1) printf(" ");
}printf("\n");
}
return 0;
}
19.矩阵旋转
对于一个给定的 3×3 矩阵,请将其顺时针旋转 90度后输出。
输入格式
测评机会反复运行程序。每次程序运行时,你的程序仅需要输入三行,第 ii 行输入三个整数 a_i,b_i,c_i(−10000≤a_i,b_i,c_i≤10000),任意两个整数之间用一个空格分开。
输出格式
输出为三行,每行包括三个整数,与题目要求的一致(从直观上看,输出的结果应为输入的矩阵旋转90度后的结果),每行的任意两个整数之间用一个空格分开,最后一个整数后面没有空格。
样例输入1
1 2 3
3 4 6
7 8 9
样例输出1
7 3 1
8 4 2
9 6 3
样例输入2
6 6 6
2 3 3
9 1 1
样例输出2
9 2 6
1 3 6
1 3 6
解题思路
观察角标性质可知
输出结果的矩阵和原矩阵的关系为
result[i][j] = matrix[3 - j - 1][i];
完整代码:
#include <stdio.h>
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int matrix[3][3];
int result[3][3];
int i;
int j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
scanf("%d", &matrix[i][j]);
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
result[i][j] = matrix[3 - j - 1][i];
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d", result[i][j]);
if (j != 2)
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
20.矩阵螺旋输出
给定一个 m 行、n 列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图)。
输入格式
测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m和 n(1≤m,n≤100),之间用一个空格分隔。接下来输入 m行,每行包含 n 个整数(−10000≤a,b,c≤10000),每两个整数之间用一个空格分隔。
输出格式
输出为一行,包括 m×n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。
样例输入1
2 3
1 2 3
3 4 6
样例输出1
1 2 3 6 4 3
样例输入2
3 2
1 2
3 4
5 6
样例输出2
1 2 4 6 5 3
完整代码:
#include <stdio.h>
int main()
{
int matrix[100][100];
int m;
int n;
int i;
int j;
//规定矩阵m行n列
scanf("%d%d", &m, &n);
//在声明的空间填充矩阵
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &matrix[i][j]);
}
}
//定义四个变量记录矩阵的四个角落
int i_tail = 0;
int j_tail = 0;
int i_head = n - 1;
int j_head = m - 1;
int count = 0;//记录矩阵输出的元素个数
i = 0;
j = 0;
while (1)
{
printf("%d", matrix[j][i]);
count++;
if (count != m * n)
{
printf(" ");
}
else
{
break;
}
//输出最外圈
if ((i >= i_tail) && (i < i_head) && (j == j_tail))//→
{
i++;
}
else if ((j >= j_tail) && (j < j_head) && i == i_head)//↓
{
j++;
}
else if ((i > i_tail) && (i <= i_head) && (j == j_head))//←
{
i--;
}
else if ((j > j_tail) && (j <= j_head) && (i == i_tail))//↑
{
j--;
}
//输出一圈后更新边界条件
if ((i == i_tail) && (j == j_tail))
{
i++;
j++;
i_head--;
j_head--;
i_tail++;
j_tail++;
}
}
return 0;
}
21.判断闰年
题目描述:
学会利用if…else…以及逻辑组合运算对一个年份是否是闰年进行判断
对于不大于3000年的年份,闰年遵循如下规律:
-
非整百年,能被4整除的为闰年。
-
整百年,能被400整除的是闰年。
公历闰年计算原则(按一回归年365天5小时48分45.5秒)
1)普通年能整除4且不能整除100的为闰年。(如2004年就是闰年,1900年不是闰年)
2)世纪年能整除400的是闰年。(如2000年是闰年,1900年不是闰年)
3)对于数值很大的年份,这年如果能被3200整除,并且能被172800整除则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能被3200整除,但不能被172800整除)(此按一回归年365天5h48’45.5’'计算)。
样例输入1
2016
样例输出1
YES
样例输入2
1900
样例输出2
NO
完整代码:
#include <stdio.h>
int main() {
int year;
// 从用户处获得一个不大于 3000 的年份
scanf("%d", &year);
// 在下面完成你的逻辑
if((year%100 !=0 && year%4 ==0)||year % 400 == 0){
printf("YES");
}else
{printf("NO");}
return 0;
}
另外一种方法
#include <stdio.h>
int main()
{
int year,a;
printf("请输人年份:\n");
scanf("%d",&year);
if(year%400==0)
a=1;
else
{
if(year%4==0&&year%100!=0)
a=1;
else
a=0;
}
if(a==1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
22.合法日历
这次的题目也不是很难。测试程序将随机给你一个格式为-
连接了年、月、日的日期字符串(其中的数字都是没有前导零的,也就是说7
不会被写成07
)。你将需要判断这个日期在我们的公历体系内是否真实存在。如果存在则输出YES
,否则输出NO
(注意输出的字母都一定是大写字母)。
测试程序给出的测试输入数据中,年、月、日都是正整数(也就是大于零的整数),均不大于3000。
已知,一年有 1 月到 12 月,共 12个不同的月份;其中 1 月、3 月、5 月、7 月、8 月、10 月、12 月有 31个合法的日,分别为 1 日到 31 日;4 月、6 月、9 月、11 月有 30个合法的日,分别为 1 日到 30 日。对于闰年,2 月有 29个合法的日,分别为 1 日到 29 日;对于平年(不是闰年的年称为平年),2 月有 28个合法的日,分别为 1 日到 28日。
对于不大于 3000 年的年份,闰年遵循如下规律:
- 非整百年,能被 4整除的为闰年。
- 整百年,能被 400整除的是闰年。
要想做好这道题,你需要先回忆一下,如何使用scanf
去接收一个指定了格式的字符串中的量(在这里就是-
前后的正整数)。
之后呢,你需要做很多的判断,会嵌套地用到我们已经学的if...else...
的结构。你将需要:
- 判断输入日期中的月份是不是合法的月份(这里特殊情况最少,建议第一层先判断);
- 针对每个月的日数判断输入日期中日的合法性;
- 注意抓住特殊的 2 月,在里面讨论年的问题(看是不是闰年);
- 对于闰年,允许 29 日的存在
- 对于非闰年不能允许 29 日的存在。
如果你还是有点想不清楚,可以参考如下这张流程图。
样例输入1
2016-2-29
样例输出1
YES
样例输入2
1900-2-29
样例输出2
NO
样例输入3
2016-13-32
样例输出3
NO
完整代码:
#include <stdio.h>
int main() {
int year;
int month;
int day; // 定义年月日,便于后续获取,使用
scanf("%d-%d-%d", &year,&month,&day);//按照格式输入 的年月日
if(month<=12&&day<=31){//判断月份和日期是否正确存在
if(month==4||month==6||month==9||month==11){//判断月份,30天的月判断
if(day<=30){
printf("YES");
}else{
printf("NO");
}
}else if(month==2){//判断二月的情况
if( ((0 == year%4)&&(0 != year%100)) ||(0 == year %400) ){//如果是闰年
if(day<=29){
printf("YES");
}else{
printf("NO");
}
}else{//如果不是闰年
if(day<=28){
printf("YES");
}else{
printf("NO");
}
}
}else{//由于剩下的都是31天,可以直接判定存在
printf("YES");
}
}else{//如果日期不存在
printf("NO");
}
}
23.判断质数
我们一边学习循环结构,一边完成了各种与质数相关的小任务。这一次,你需要在没有引导的情况下,独立完成一个比我们之前课程中学习的内容略简单一点的小任务:
我们都知道,对于一个大于1的整数,如果除了1和它本身,它不再被其它正整数整除,那么我们说它是一个质数。
请对于给定的一个大于1的正整数 N(你可以认为测评机给出的 N均小于 1000),判定它是否是一个质数。
输入格式
测评机会反复运行你的程序。每次程序运行时,你的程序仅需输入一个符合描述的正整数。
输出格式
输出也仅为一行,如果判题机在输入中给出的数字为质数,那么请输出YES
;否则,请输出NO
。
样例输入1
3
样例输出1
YES
样例输入2
9
样例输出2
NO
完整代码:
#include <stdio.h>
#include <math.h>
int main() {
int digit;//除数
int divisor;//被除数
int flag;
scanf("%d", &digit);
if (digit < 2)
{
printf("NO\n");
return 0;
}
if (digit == 2)
{
printf("YES\n");
return 0;
}
for (divisor = 2; divisor <= sqrt(digit); divisor ++)
{
if (digit % divisor == 0)
{
flag = 0;
break;
}
if(divisor > sqrt(digit))
{
flag = 1;
}
}
if(flag == 1)
printf("YES\n");
if(flag == 0)
printf("NO\n");
return 0;
}
24.实现水仙花数输出
题目描述:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+33。 现在要求输出所有在m和n范围内的水仙花数。
输入描述
输入数据有多组,每组占一行,包括两个整数m和n(100 ≤ m ≤ n ≤ 999)。
输出描述
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行
完整代码:
#include <stdio.h>
int main()
{
int start, end, i = 0, a, b, c, size = 0;
while (scanf("%d %d", &start, &end) == 2)
{
for (i = start; i <= end; i++)
{
a = i / 100;
b = i / 10 % 10;
c = i % 10;
//total = pow(c, 3) + pow(a, 3) + pow(b, 3);
if ((a*a*a + b*b*b + c*c*c) == i) //满足水仙花条件
{
if (size == 0) //size=0输出第一个水仙花数
{
printf("%d", i);
}
else //size++输出第二。。第n个水仙花数
{
printf(" %d", i);
}
size++; //个数++;
}
}
if (size == 0) //范围内个数为0,则说明没有满足条件的
{
printf("no");
}
printf("\n");
}
return 0;
}