目录
7-1 查找整数
7-2 大笨钟的心情
7-3 将数组中的数逆序存放
7-6 矩阵运算
7-7 求矩阵的局部极大值
7-8 矩阵A乘以B
7-9 找鞍点
6-1 查找数组元素最大值
6-2 在数组中查找指定元素
7-5 求数列之和[A]
6-3 使用函数的选择法排序
6-5 计算天数[2]
6-4 求矩阵不靠边元素之和
7-4 二分查找法之过程
6-6 数组循环右移
7-11 查找指定字符
7-12 凯撒密码
7-14 字符串排序
6-8 歌唱比赛打分
7-1 找最长的字符串
7-4 输出学生成绩
7-3 矩阵边界和
7-5 查找奥运五环色的位置
6-1 计算两数的和与差
6-2 使用函数找出数组中的最大值
6-3 在数组中查找指定元素
6-4 查找星期
6-5 字符串的连接
6-6 分类统计字符个数
6-7 移动字母
6-8 利用指针找最大值
7-1 平面向量加法
7-2 计算平均成绩
7-3 计算职工工资
7-6 有理数比较
7-7 通讯录排序
7-5 时间换算
6-1 计算两个复数之积
6-2 按等级统计学生成绩
6-3 Add Two Complex Numbers by Passing Structure to a Function
6-4 学生成绩比高低
6-5 修改学生成绩
7-1 学生信息的那些操作
7-2 学生信息的那些操作
7-3 学生信息的那些操作
7-4 学生信息的那些操作
7-7 学生信息的那些操作
7-6 寻找250
7-5 求整数段和
7-4 谁是赢家
6-1 使用递归函数计算1到n之和
6-2 递归实现指数函数
6-3 递归计算Ackermenn函数
6-4 递归求Fabonacci数列
6-8 递归计算P函数
6-1 两整数排序(降序)
6-2 计算两数的和与差
6-3 使用函数找出数组中的最大值
6-4 在数组中查找指定元素
6-5 查找星期
6-6 字符串的连接
7-1 输出平均分最高的学生信息
7-1 查找整数
分数 10
本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。
输入格式
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。
输出格式
在一行中输出X的位置,或者“Not Found”。
输入样例1
5 7
3 5 7 1 9
输出样例1
2
输入样例2
5 7
3 5 8 1 9
输出样例2
Not Found
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
#include <stdio.h>
int main()
{
int N,X;
scanf("%d %d",&N,&X);
int arr[N];
int i=0;
for(i=0;i<N;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<N;i++)
{
if(arr[i]==X)
{
printf("%d",i);
break;
}
}
if(arr[i]!=X)
{
printf("Not Found");
}
return 0;
}
7-2 大笨钟的心情
分数 15
有网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……
本题就请你替大笨钟写一个程序,根据心情自动输出回答。
输入格式
输入在一行中给出 24 个 [0, 100] 区间内的整数,依次代表大笨钟在一天 24 小时中,每个小时的心情指数。
随后若干行,每行给出一个 [0, 23] 之间的整数,代表网友询问笨钟这个问题的时间点。当出现非法的时间点时,表示输入结束,这个非法输入不要处理。题目保证至少有 1 次询问。
输出格式
对每一次提问,如果当时笨钟的心情指数大于 50,就在一行中输出 心情指数 Yes,否则输出 心情指数 No。
输入样例
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1
输出样例
52 Yes
20 No
50 No
58 Yes
代码长度限制16 KB
Java (javac)
时间限制600 ms
内存限制64 MB
其他编译器
时间限制400 ms
内存限制64 MB
代码内容
#include <stdio.h>
int main()
{
int arr[24];
int i,n;
for(i=0;i<24;i++){
scanf("%d",&arr[i]);
}
while(1){
scanf("%d",&n);
if(n<0||n>23){
break;
}
if(arr[n]>50){
printf("%d Yes\n",arr[n]);
}else{
printf("%d No\n",arr[n]);
}
}
return 0;
}
7-3 将数组中的数逆序存放
分数 20
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入格式
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
输出格式
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
输入样例
4
10 8 1 2
输出样例
2 1 8 10
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int arr[10];
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
int tmp=0;
for(i=0;i<n/2;i++)
{
tmp=arr[i];
arr[i]=arr[n-1-i];
arr[n-1-i]=tmp;
}
for(i=0;i<n;i++)
{
printf("%d",arr[i]);
if(i!=n-1)
{
printf(" ");
}
}
return 0;
}
7-6 矩阵运算
分数 20
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
输出格式
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
输入样例
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出样例
35
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
#include <stdio.h>
int main()
{
int n=0;
scanf("%d\n",&n);
int sum=0;
int arr[n][n];
int i=0;
int j=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==n-1||j==n-1||i+j==n-1)
continue;
else
sum+=arr[i][j];
}
}
printf("%d",sum);
return 0;
}
7-7 求矩阵的局部极大值
分数 15
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入格式
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。
输出格式
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。
输入样例1
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1
9 2 3
5 3 2
5 3 4
输入样例2
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2
None 3 5
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
#include <stdio.h>
int main()
{
int m,n;
scanf("%d %d\n",&m,&n);
int arr[m][n];
int count=0;
int i=0;
int j=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(i=1;i<m-1;i++)
{
for(j=1;j<n-1;j++)
{
if(arr[i][j]>arr[i-1][j]&&arr[i][j]>arr[i+1][j]&&arr[i][j]>arr[i][j-1]&&arr[i][j]>arr[i][j+1])
{
printf("%d %d %d\n",arr[i][j],i+1,j+1);
count++;
}
}
}
if(count==0)
{
printf("None %d %d",m,n);
}
return 0;
}
7-8 矩阵A乘以B
分数 15
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra行、Ca列,B有Rb行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。
输入格式
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。
输出格式
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。
输入样例1
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1
2 4
20 22 24 16
53 58 63 28
输入样例2
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2
Error: 2 != 3
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
#include <stdio.h>
int main()
{
int m1,n1,m2,n2;
scanf("%d %d",&m1,&n1);
int arr[100][100];
int arr1[100][100];
int i=0;
int j=0;
int k=0;
for(i=0;i<m1;i++)
{
for(j=0;j<n1;j++)
{
scanf("%d",&arr1[i][j]);
}
}
scanf("%d %d",&m2,&n2);
int arr2[100][100];
for(i=0;i<m2;i++)
{
for(j=0;j<n2;j++)
{
scanf("%d",&arr2[i][j]);
}
}
if(n1!=m2)
{
printf("Error: %d != %d",n1,m2);
}
else
{
printf("%d %d\n",m1,n2);
for(i=0;i<m1;i++)
{
for(j=0;j<n2;j++)
{
for(k=0;k<n1;k++)
{
arr[i][j]+=arr1[i][k]*arr2[k][j];
}
printf("%d",arr[i][j]);
if(j<n2-1)
{
printf(" ");
}
else{
printf("\n");
}
}
}
}
return 0;
}
7-9 找鞍点
分数 20
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1
2 1
输入样例2
2
1 7
4 1
输出样例2
NONE
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
#include<stdio.h>
int main()
{
int arr[6][6];
int n;
int test = 0;
scanf("%d", &n);
int i=0;
int j=0;
int k=0;
int max1=0;
int index=0;
int flag=1;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (int i = 0; i < n; i++)
{
max1 = arr[i][0];
index = 0;
flag = 1;
for (int j = 1; j < n; j++)
{
if (arr[i][j] >= max1)
{
max1 = arr[i][j];
index = j;
}
}
for (int k = 0; k < n; k++)
{
if (arr[k][index] < max1)
{
flag = 0;
break;
}
}
if (flag == 1)
{
test = 1;
printf("%d %d", i, index);
break;
}
}
if (test == 0)
{
printf("NONE");
}
return 0;
}
6-1 查找数组元素最大值
分数 10
本题要求实现一个函数,查找数组中最大元素的下标。例如数组为{1,3,5,7,9},则该函数应该返回4。题目输入保证数组元素各不相同。
函数接口定义
intindexOfMax(int *array, int size);
其中 array 和 size 是用户传入的参数。 array 是数组首地址; size 是数组元素的个数。函数须返回数组中最大元素的下标(从0开始)。
裁判测试程序样例
/* 此测试程序仅为示例,实际的测试程序可能不同 */
#include<stdio.h>
#define MAXSIZE 100
int indexOfMax(int *array, int size);
int main()
{
int num[MAXSIZE];
int total;
scanf("%d",&total);
for(int i=0; i<total; i++)
scanf("%d",&num[i]);
printf("%d\n",num[indexOfMax(num,total)]);
return0;
}
/* 你所编写的函数代码将被嵌在这里 */
输入样例
4 2016 2017 1999 1998
输出样例
2017
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
int indexOfMax(int *array, int size)
{
int i=0;
int max=array[0];
int count=0;
for(i=0;i<size;i++)
{
if(max<array[i])
{
max=array[i];
count++;
}
}
return count;
}
6-2 在数组中查找指定元素
分数 10
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义
intsearch( intlist[], int n, int x );
其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到
则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例
#include<stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main(){
int i, index, n, x;
int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
else printf("Not found\n");
return0;
}
/* 你的代码将被嵌在这里 */
输入样例1
5
1 2 2 5 4
2
输出样例1
index = 1
输入样例2
5
1 2 2 5 4
0
输出样例2
Not found
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
代码内容
int search( int list[], int n, int x )
{
int i=0;
for(i=0;i<n;i++)
{
if(list[i]==x)
{
return i;
break;
}
}
return -1;
}
7-5 求数列之和[A]
分数 10
给定一个数字A (1⩽A⩽9)以及一个非负整数N (0⩽N⩽15),编程计算sum=A+AA+AAA+⋯+AA⋯A(N个A), 例如当A=2,N=3时,S=2+22+222=246。
输入格式
在一行内输入数字A与非负整数N。数与数之间用空格间隔。
输出格式
按照S = xxx的格式输出其N项之和S的值。
输入样例
2 3
输出样例
在这里给出相应的输出。例如:
S = 246
说明
本题是在浙江大学DS课程组《求数列和-加强版》的基础上降低了N的取值范围,使得数列各项及其总和能在整数的取值范围内表示。
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
int main()
{
int A=0;
int N=0;
scanf("%d %d",&A,&N);
int i=0;
int sum=0;
int ret=0;//第一项
for(i=0;i<N;i++)
{
ret=ret*10+A;
sum+=ret;
}
printf("S = %d",sum);
return 0;
}
6-3 使用函数的选择法排序
分数 15
本题要求实现一个用选择法对整数数组进行简单排序的函数。
函数接口定义
voidsort( int a[], int n );
其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。
裁判测试程序样例
#include<stdio.h>#define MAXN 10voidsort( int a[], int n );
intmain(){
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);
sort(a, n);
printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");
return0;
}
/* 你的代码将被嵌在这里 */
输入样例
4
5 1 7 6
输出样例
After sorted the array is: 1 5 6 7
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
void sort(int a[],int n)
{
int i=0;
int tmp=0;
for(i=0;i<n-1;i++)
{
int j=0;
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
}
6-5 计算天数[2]
分数 15
本题要求实现一个简单函数,计算年year、月month和日day对应的是该年的第几天。其中1、3、5、7、8、10、12月有31天,4、6、9、11月有30天,2月平年有28天,闰年有29天。判断闰年的条件是:能被 4 整除但不能被 100 整除,或者能被 400 整除。
函数接口定义
在这里描述函数接口。例如:
intday_of_year(int year, int month);
其中year、month和day是用户传入的参数。函数返回年year、月month和日day对应的是该年的第几天。
裁判测试程序样例
# include<stdio.h>intday_of_year(int year, int month, int day);
intmain(void){
int day, month, year;
scanf("%d%d%d", &year, &month, &day);
printf("%d\n", day_of_year(year, month, day));
return0;
}
/* 请在这里填写答案 */
输入样例1
2000 3 1
输出样例1
61
输入样例2
1981 3 1
输出样例2
60
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int day_of_year(int year, int month,int day)
{
int sum1=0;
int sum=0;
int i=0;
if((year%4==0&&year%100!=0)||year%400==0)
{
int arr1[]={31,29,31,30,31,30,31,31,30,31,30,31};
for(i=0;i<month-1;i++)
{
sum1=sum1+arr1[i];
}
sum=sum1+day;
}
else
{
int arr2[13]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0;i<month-1;i++)
{
sum1=sum1+arr2[i];
}
sum=sum1+day;
}
return sum;
}
6-4 求矩阵不靠边元素之和
分数 10
求矩阵的所有不靠边元素之和,矩阵行的值m从键盘读入(2<=m<=10),调用自定义函数Input实现矩阵元素从键盘输入,调用Sum函数实现求和。(只考虑float型,且不需考虑求和的结果可能超出float型能表示的范围)。
函数接口定义
void Input(float a[][N], int m );
float Sum( float a[][N], int m );
Input函数完成从键盘矩阵元素的功能,
Sum函数完成求和并将结果返回。
m 代表矩阵的行。
裁判测试程序样例
#include<stdio.h>
#define M 10
#define N 4
void Input(float a[][N],int m);
float Sum(float a[][N],int m);
int main(void){
float num[M][N],sum;
int m;
scanf("%d", &m);
Input(num,m);
sum = Sum(num,m);
printf("sum = %.2f\n", sum);
return 0;
}
/* 请在这里填写答案 */
输入样例
4
18 29.5 45 33
66 3.4 11.5 57
70 100 2 16.9
15 25.8 4.5 36
输出样例
sum = 116.90
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
void Input (float a[][N], int m )
{
int i=0;
int j=0;
for(i=0;i<m;i++)
{
for(j=0;j<N;j++)
{
scanf("%f",&a[i][j]);
}
}
}
float Sum ( float a[][N], int m )
{
int i=0;
float sum1=0;
int j=0;
for(i=1;i<m-1;i++)
{
for(j=1;j<N-1;j++)
{
sum1+=a[i][j];
}
}
return sum1;
}
7-4 二分查找法之过程
分数 15
本题要求使用二分查找法,在给定的n个升序排列的整数中查找x,并输出查找过程中每一步的中间结果。如果数组a中的元素与x的值相同,输出相应的下标(下标从0开始);如果没有找到,输出“Not Found”。如果输入的n个整数没有按照从小到大的顺序排列,或者出现了相同的数,则输出“Invalid Value”。
二分查找法的算法步骤描述如下:
设n个元素的数组a已升序排列,用left和right两个变量来表示查找的区间,即在a[left] 〜 a[right]区间去查找x。初始状态为left = 0,right = n-1。首先用要查找的x与查找区间的中间位置元素a[mid](mid = (left + right) / 2)比较,如果相等则找到;如果x < a[mid],由于数组是升序排列的,则只要在a[left] 〜 a[mid-1]区间继续查找;如果x > a[mid],则只要在a[mid+1] 〜 a[right]区间继续查找。也就是根据与中间元素比较的情况产生了新的区间值left、right值,当出现left > right时,说明不存在值为x的元素。
输入格式
输入在第1行中给出一个正整数n(1≤n≤10)和一个整数x,第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。
输出格式
在每一行中输出查找过程中对应步骤的中间结果,按照“[left,right][mid]”的格式输出。提示:相邻数字、符号之间没有空格。
如果找到,输出相应的下标(下标从0开始);如果没有找到,在一行中输出“Not Found”。
如果输入的n个整数没有按照从小到大的顺序排列,或者出现了相同的数,则输出“Invalid Value”。
输入样例1
10 2
1 2 3 4 5 6 7 8 9 10
输出样例1
[0,9][4]
[0,3][1]
1
输入样例2
4 5
71 74 78 100
输出样例2
[0,3][1]
[0,0][0]
Not Found
输入样例3
5 5
39 60 80 80 100
输出样例3
Invalid Value
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
void Binary(int arr[],int n,int x)
{
int left=0;
int right=n-1;
while(left<=right)
{
int mid=0;
mid=(left+right)/2;
printf("[%d,%d][%d]\n",left,right,mid);
if(arr[mid]>x)
{
right=mid-1;
}
if(arr[mid]<x)
{
left=mid+1;
}
if(arr[mid]==x)
{
printf("%d\n",mid);
break;
}
}
if(left>right)
{
printf("Not Found\n");
}
}
int main()
{
int n=0;
int x=0;
int i=0;
int j=0;
int flag=0;
int arr[10]={0};
scanf("%d %d\n",&n,&x);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(j=0;j<n-1;j++)
{
if(arr[j]<arr[j+1])
{
flag=0;
}
if(arr[j]>=arr[j+1])
{
flag=1;
break;
}
}
if(flag==0)
{
Binary(arr,n,x);
}
else if(flag==1)
{
printf("Invalid Value\n");
}
return 0;
}
6-6 数组循环右移
分数 15
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。
函数接口定义
voidArrayShift( int a[], int n, int m );
其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。
裁判测试程序样例
#include<stdio.h>#define MAXN 10voidArrayShift( int a[], int n, int m );
intmain(){
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return0;
}
/* 你的代码将被嵌在这里 */
输入样例
6 2
1 2 3 4 5 6
输出样例
5 6 1 2 3 4
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
void ArrayShift( int a[], int n, int m )
{
int i=0;
int j=0;
int b[n-1];
if(m>n)
{
m=m%n;
}
//先把a中的前(n-m)个数存放到b的后(n-m)个位置
for(i=m;i<n;i++)
{
b[i]=a[j];
j++;
}
//再把a中剩下的数放到b的前面
for(i=0;i<m;i++)
{
b[i]=a[j];
j++;
}
//再把b拷贝给a
for(i=0;i<n;i++)
{
a[i]=b[i];
}
}
7-11 查找指定字符
分数 15
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
输入样例1
m
programming
输出样例1
index = 7
输入样例2
a
1234
输出样例2
Not Found
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution 1
#include <stdio.h>
#include <string.h>
int main()
{
char x='0';
scanf("%c",&x);
getchar();
char arr[81]="0";
gets(arr);
int len=strlen(arr);
int i=0;
for(i=len-1;i>=0;i--)
{
if(arr[i]==x)
{
printf("index = %d",i);
return 0;
}
}
printf("Not Found");
return 0;
}
Solution 2
#include <stdio.h>
#include <string.h>
int main()
{
char x='0';
scanf("%c",&x);
char ch;
ch=getchar();
char arr[81]="0";
gets(arr);
int index=-1;
int i=0;
for(i=0;arr[i]!='\0';i++)
{
if(arr[i]==x)
{
index=i;
}
}
if(index!=-1)
{
printf("index = %d",index);
}
else
{
printf("Not Found");
}
return 0;
}
7-12 凯撒密码
分数 20
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式
输出加密后的结果字符串。
输入样例1
Hello Hangzhou
2
输出样例1
Jgnnq Jcpibjqw
输入样例2
a=x+y
-1
输出样例2
z=w+x
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <ctype.h>
int main()
{
char arr[80]={0};
int offset=0;
gets(arr);
scanf("%d",&offset);
int len=strlen(arr);
offset=offset%26;
int i=0;
for(i=0;i<len;i++)
{
if(isupper(arr[i])!=0)
{
arr[i]=(arr[i]-'A'+offset+26)%26+'A';
}
if(islower(arr[i])!=0)
{
arr[i]=(arr[i]-'a'+offset+26)%26+'a';
}
}
printf(arr);
return 0;
}
7-14 字符串排序
分数 20
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
输入格式
输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。
输出格式
按照以下格式输出排序后的结果:
After sorted:
每行一个字符串
输入样例
red yellow blue black white
输出样例
After sorted:
black
blue
red
white
yellow
鸣谢贵州民族大学张玉全老师修正数据!
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_char(const void*e1,const void*e2)
{
return strcmp((char*)e1,(char*)e2);
}
int main()
{
char arr[5][80];
int i=0;
for(i=0;i<5;i++)
{
scanf("%s",arr[i]);
}
//void qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*));
qsort(arr,5,sizeof(arr[0]),cmp_char);
printf("After sorted:\n");
for(i=0;i<5;i++)
{
puts(arr[i]);
}
return 0;
}
6-8 歌唱比赛打分
分数 10
某歌唱比赛计分规则是:对于评委给出的分数,去掉一个最高分,去掉一个最低分,剩余分数求算术平均值并保留2位小数,作为选手最终得分。
本题要求实现这样一个计分函数。
评委给出的分数存在数组中,分数均为0~100之间的整数,并且保证评委人数在3~20之间。
函数接口定义
doublegetScore(int *score, int total);
其中score和total是传入的参数,score是评委打分数组的首地址,total是评委人数;
函数将选手的得分以double类型返回,注意:函数返回的分数只需保证小数点后至少2位精确数字即可,打印2位小数得分的操作由函数调用者进行。
裁判测试程序样例
/* 此测试程序仅为示例,实际的测试程序可能不同,不要仅针对样例的输入和输出编写函数,而是要根据题意要求编写函数 */#include<stdio.h>doublegetScore(int *score, int total);
intmain(){
int score[5] = {92, 90, 99, 95, 98}; /* 仅为示例,实际的测试程序中,数组大小和元素数值都可能与样例不同 */printf("%.2f\n", getScore(score, 5) ); /* getScore( )函数只负责返回分值,由main函数中的代码负责按照2位小数打印输出 */return0;
}
/* 你所编写的函数代码将被嵌在这里,注意:不要提交你编写的用于测试的main( )函数,否则无法通过编译 */
输入样例
对于本题给出的裁判测试程序样例,没有输入。实际的裁判程序可能有输入。
输出样例
对于本题给出的裁判测试程序样例,只有一行输出如下。实际的裁判程序可能有其他输出情况。
95.00
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
double getScore(int *score, int total)
{
int i=0;
double sum=0;
int min=100;
int max=0;
for(i=0;i<total;i++)
{
sum+=*(score+i);
if(*(score+i)>max)
{
max=*(score+i);
}
if(*(score+i)<min)
{
min=*(score+i);
}
}
return (sum-min-max)/(total-2);
}
7-1 找最长的字符串
分数 15
全屏浏览题目
切换布局
作者 张泳单位 浙大城市学院
本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。
输入格式
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式
在一行中用以下格式输出最长的字符串:
The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。
输入样例
5
li
wang
zhang
jin
xiang
输出样例
The longest is: zhang
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <string.h>
int main()
{
int N=0;
int longest=0;
scanf("%d",&N);
char arr[N][80];
char tmp[80];
int i=0;
for(i=0;i<N;i++)
{
scanf("%s",arr[i]);
}
longest=strlen(arr[0]);
for(i=1;i<N;i++)
{
if(strlen(arr[i])>longest)
{
longest=strlen(arr[i]);
strcpy(tmp,arr[i]);
}
}
if(longest==strlen(arr[0]))
{
strcpy(tmp,arr[0]);
}
printf("The longest is: %s",tmp);
return 0;
}
7-4 输出学生成绩
分数 20
全屏浏览题目
切换布局
作者 张泳单位 浙大城市学院
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
输入格式
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
输出格式
按照以下格式输出:
average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。
输入样例
3
85 90 95
输出样例
average = 90.00
max = 95.00
min = 85.00
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <malloc.h>
int main()
{
int N=0;
scanf("%d",&N);
int* p=(int*)malloc(N*sizeof(int));
if(p==NULL)
{
perror("main");
return 0;
}
double sum=0;
double max=0;
double min=100;
int i=0;
for(i=0;i<N;i++)
{
scanf("%d",p+i);
}
for(i=0;i<N;i++)
{
sum+=*(p+i);
if(*(p+i)>max)
{
max=*(p+i);
}
if(*(p+i)<min)
{
min=*(p+i);
}
}
printf("average = %.2f\n",sum/N);
printf("max = %.2f\n",max);
printf("min = %.2f\n",min);
free(p);
p=NULL;
return 0;
}
7-3 矩阵边界和
分数 10
给定一个m行n列的二维矩阵,求其四周边元素和。1<=m、n<=100000,可能是1行100000列,也可能是10000行50列,但保证矩阵元素不多于500000。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。你可以动态申请m*n个内存单元,然后用一维数组来存储二维数组,二维数组元素a[i][j]对应一维数组a[i*n+j],i、j均从0开始。
输入格式
输入第一行是m和n,然后是一个m行n列的矩阵。
输出格式
输出一个整数,表示矩阵所有边界元素的和。
输入样例
在这里给出一组输入。例如:
3 4
1 2 3 4
5 6 7 8
9 5 4 6
输出样例
在这里给出相应的输出。例如:
47
代码长度限制16 KB
时间限制1000 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <malloc.h>
int main()
{
int m=0;
int n=0;
scanf("%d %d",&m,&n);
int sum=0;
int*p=(int*)malloc(m*n*sizeof(int));
if(p==NULL)
{
perror("main");
return 0;
}
int i=0;
int j=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&p[i*n+j]);
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(i==0||i==m-1||j==0||j==n-1)
{
sum+=p[i*n+j];
}
}
}
printf("%d",sum);
free(p);
p=NULL;
return 0;
}
7-5 查找奥运五环色的位置
分数 10
奥运五环的5种颜色的英文单词按一定顺序排列{"red", "blue", "yellow", "green", "black" },定义指针数组并初始化,输入任意一个颜色的英文单词,从已有颜色中查找并输出该颜色的位置值,若没有找到,则输出"Not Found"。
输入格式
输入一个代表颜色的单词。
输出格式
输出单词对应的位置值,如果未找到,输出Not Found。
输入样例
yellow
输出样例
3
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <string.h>
int main()
{
char* p[5]={"red", "blue", "yellow", "green", "black"};
char arr[10]={0};
int index=-1;
scanf("%s",arr);
int i=0;
for(i=0;i<5;i++)
{
if(strcmp(arr,p[i])==0)
{
printf("%d",i+1);
index=0;
break;
}
}
if(index==-1)
{
printf("Not Found");
}
return 0;
}
6-1 计算两数的和与差
分数 10
本题要求实现一个计算输入的两数的和与差的简单函数。
函数接口定义
voidsum_diff( float op1, float op2, float *psum, float *pdiff );
其中op1和op2是输入的两个实数,*psum和*pdiff是计算得出的和与差。
裁判测试程序样例
#include<stdio.h>voidsum_diff( float op1, float op2, float *psum, float *pdiff );
intmain(){
float a, b, sum, diff;
scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
return0;
}
/* 你的代码将被嵌在这里 */
输入样例
4 6
输出样例
The sum is 10.00
The diff is -2.00
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2;
*pdiff=op1-op2;
}
6-2 使用函数找出数组中的最大值
分数 15
本题要求实现一个找出整型数组中最大值的函数。
函数接口定义
intFindArrayMax( int a[], int n );
其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。
裁判测试程序样例
#include<stdio.h>#define MAXN 10intFindArrayMax( int a[], int n );
intmain(){
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ ){
scanf("%d", &a[i]);
}
printf("%d\n", FindArrayMax(a, n));
return0;
}
/* 请在这里填写答案 */
输入样例
4
20 78 99 -14
输出样例
99
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int FindArrayMax( int a[], int n )
{
int i=0;
int max=a[0];
for(i=1;i<n;i++)
{
if(*(a+i)>max)
{
max=*(a+i);
}
}
return max;
}
6-3 在数组中查找指定元素
分数 10
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义
intsearch( intlist[], int n, int x );
其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到
则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例
#include<stdio.h>#define MAXN 10intsearch( intlist[], int n, int x );
intmain(){
int i, index, n, x;
int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
elseprintf("Not found\n");
return0;
}
/* 你的代码将被嵌在这里 */
输入样例1
5
1 2 2 5 4
2
输出样例1
index = 1
输入样例2
5
1 2 2 5 4
0
输出样例2
Not found
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int search( int list[], int n, int x )
{
int i=0;
for(i=0;i<n;i++)
{
if(*(list+i)==x)
{
return i;
}
}
return -1;
}
6-4 查找星期
分数 15
本题要求实现函数,可以根据下表查找到星期,返回对应的序号。
序号 | 星期 |
0 | Sunday |
1 | Monday |
2 | Tuesday |
3 | Wednesday |
4 | Thursday |
5 | Friday |
6 | Saturday |
函数接口定义
intgetindex( char *s );
函数getindex应返回字符串s序号。如果传入的参数s不是一个代表星期的字符串,则返回-1。
裁判测试程序样例
#include<stdio.h>#include<string.h>#define MAXS 80intgetindex( char *s );
intmain(){
int n;
char s[MAXS];
scanf("%s", s);
n = getindex(s);
if ( n==-1 ) printf("wrong input!\n");
elseprintf("%d\n", n);
return0;
}
/* 你的代码将被嵌在这里 */
输入样例1
Tuesday
输出样例1
2
输入样例2
today
输出样例2
wrong input!
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int getindex( char *s )
{
char arr[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i=0;
for(i=0;i<7;i++)
{
if(strcmp(s,arr[i])==0)
{
return i;
}
}
return -1;
}
6-5 字符串的连接
分数 15
本题要求实现一个函数,将两个字符串连接起来。
函数接口定义
char *str_cat( char *s, char *t );
函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。
裁判测试程序样例
#include<stdio.h>
#include<string.h>
#define MAXS 10
char *str_cat( char *s, char *t );
int main(){
char *p;
char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
scanf("%s%s", str1, str2);
p = str_cat(str1, str2);
printf("%s\n%s\n", p, str1);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
abc
def
输出样例
abcdef
abcdef
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
char *str_cat( char *s, char *t )
{
return strcat(s,t);
}
6-6 分类统计字符个数
分数 15
全屏浏览题目
切换布局
作者 颜晖单位 浙大城市学院
本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。
函数接口定义:
voidStringCount( char s[] );
其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照
letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数
的格式输出。
裁判测试程序样例:
#include<stdio.h>
#define MAXS 15
void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main(){
char s[MAXS];
ReadString(s);
StringCount(s);
return 0;
}
/* Your function will be put here */
输入样例:
aZ &
09 Az
输出样例:
letter = 4, blank = 3, digit = 2, other = 1
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <ctype.h>
void StringCount( char s[] )
{
int count1=0;
int count2=0;
int count3=0;
int count4=0;
int i=0;
for(i=0;s[i]!='\0';i++)
{
if(isalpha(s[i])!=0)
{
count1++;
}
if(s[i]==' '||s[i]=='\n')
{
count2++;
}
if(isdigit(s[i])!=0)
{
count3++;
}
if(isalpha(s[i])==0&&isdigit(s[i])==0&&s[i]!=' '&&s[i]!='\n')
{
count4++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",count1,count2,count3,count4);
}
6-7 移动字母
分数 10
本题要求编写函数,将输入字符串的前3个字符移到最后。
函数接口定义
voidShift( char s[] );
其中char s[]是用户传入的字符串,题目保证其长度不小于3;函数Shift须将按照要求变换后的字符串仍然存在s[]里。
裁判测试程序样例
#include<stdio.h>
#include<string.h
>#define MAXS 10
void Shift( char s[] );
void GetString( char s[] ); /* 实现细节在此不表 */
int main(){
char s[MAXS];
GetString(s);
Shift(s);
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
abcdef
输出样例
defabc
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
void Shift( char s[] )
{
int len=strlen(s);
char arr1[MAXS]={0};
int i=0;
int j=0;
for(i=3;i<len;i++,j++)
{
arr1[j]=*(s+i);
}
for(i=0;i<3;i++,j++)
{
arr1[j]=*(s+i);
}
s=strcpy(s,arr1);
}
6-8 利用指针找最大值
分数 10
本题要求实现一个简单函数,找出两个数中的最大值。
函数接口定义
voidfindmax( int *px, int *py, int *pmax );
其中px和py是用户传入的两个整数的指针。函数findmax应找出两个指针所指向的整数中的最大值,存放在pmax指向的位置。
裁判测试程序样例
#include<stdio.h>
void findmax( int *px, int *py, int *pmax );
int main(){
int max, x, y;
scanf("%d %d", &x, &y);
findmax( &x, &y, &max );
printf("%d\n", max);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
3 5
输出样例
5
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
void findmax( int *px, int *py, int *pmax )
{
if(*px>*py)
{
*pmax=*px;
}
else if(*px<*py)
{
*pmax=*py;
}
}
7-1 平面向量加法
分数 10
本题要求编写程序,计算两个二维平面向量的和向量。
输入格式
输入在一行中按照“x1 y1 x2 y2”的格式给出两个二维平面向量v1=(x1,y1)和v2=(x2,y2)的分量。
输出格式
在一行中按照(x, y)的格式输出和向量,坐标输出小数点后一位(注意不能输出−0.0)。
输入样例
3.5 -2.7 -13.9 8.7
输出样例
(-10.4, 6.0)
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <math.h>
struct vector
{
double x;
double y;
}a,b,c;
int main()
{
scanf("%lf %lf %lf %lf",&a.x,&a.y,&b.x,&b.y);
c.x=a.x+b.x;
c.y=a.y+b.y;
if(fabs(c.x)<0.05)
{
c.x=fabs(c.x);
}
if(fabs(c.y)<0.05)
{
c.y=fabs(c.y);
}
printf("(%.1f, %.1f)",c.x,c.y);
return 0;
}
7-2 计算平均成绩
分数 10
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。
输入格式
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。
输出格式
首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。
输入样例
5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60
输出样例
80.00
zhang 00001
chen 21987
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
struct stu
{
char number[6];
char name[10];
double score;
};
int main()
{
int N=0;
scanf("%d",&N);
double sum=0;
double average=0;
struct stu p[11]={0};
int i=0;
for(i=0;i<N;i++)
{
scanf("%s %s %lf",p[i].number,p[i].name,&p[i].score);
}
for(i=0;i<N;i++)
{
sum+=p[i].score;
}
average=sum/N*1.0;
printf("%.2f\n",average);
for(i=0;i<N;i++)
{
if(p[i].score<average)
{
printf("%s %s\n",p[i].name,p[i].number);
}
}
return 0;
}
7-3 计算职工工资
分数 10
给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。
输入格式
输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。
输出格式
按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。
输入样例
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80
输出样例
zhao 565.00
qian 430.00
zhou 630.00
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
struct employee
{
char name[10];
float base_salary;
float variable_pay;
float expenditures;
};
int main()
{
int N=0;
scanf("%d",&N);
struct employee p[10000]={0};
int i=0;
for(i=0;i<N;i++)
{
scanf("%s %f %f %f",p[i].name,&p[i].base_salary,&p[i].variable_pay,&p[i].expenditures);
}
for(i=0;i<N;i++)
{
printf("%s %.2f\n",p[i].name,p[i].base_salary+p[i].variable_pay-p[i].expenditures);
}
return 0;
}
7-6 有理数比较
分数 10
本题要求编写程序,比较两个有理数的大小。
输入格式
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式
在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”。
输入样例1
1/2 3/4
输出样例1
1/2 < 3/4
输入样例2
6/8 3/4
输出样例2
6/8 = 3/4
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
struct number
{
double a;
double b;
}x,y;
int main()
{
scanf("%lf/%lf %lf/%lf",&x.a,&x.b,&y.a,&y.b);
double result1=0.0;
double result2=0.0;
result1=x.a/x.b;
result2=y.a/y.b;
if(result1>result2)
{
printf("%.0f/%.0f > %.0f/%.0f\n",x.a,x.b,y.a,y.b);
}
else if(result1<result2)
{
printf("%.0f/%.0f < %.0f/%.0f\n",x.a,x.b,y.a,y.b);
}
else
{
printf("%.0f/%.0f = %.0f/%.0f\n",x.a,x.b,y.a,y.b);
}
return 0;
}
7-7 通讯录排序
分数 20
输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
输入格式
输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+、-组成的字符串。
输出格式
按照年龄从大到小输出朋友的信息,格式同输出。
输入样例
3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
输出样例
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <stdlib.h>
struct friend
{
char name[11];
char birth[9];
char telephone[18];
};
int cmp_struct(const void* e1, const void* e2)
{
return strcmp(((struct friend*)e1)->birth, ((struct friend*)e2)->birth);
}
int main()
{
int n=0;
scanf("%d",&n);
struct friend p[n];
int i=0;
for(i=0;i<n;i++)
{
scanf("%s %s %s",p[i].name,p[i].birth,p[i].telephone);
}
qsort(p,n,sizeof(p[0]),cmp_struct);
for(i=0;i<n;i++)
{
printf("%s %s %s\n",p[i].name,p[i].birth,p[i].telephone);;
}
return 0;
}
7-5 时间换算
分数 10
本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。
输入格式
输入在第一行中以hh:mm:ss的格式给出起始时间,第二行给出整秒数n(<60)。
输出格式
输出在一行中给出hh:mm:ss格式的结果时间。
输入样例
11:59:40
30
输出样例
12:00:10
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
struct time
{
int hour;
int minute;
int second;
};
int main()
{
struct time a={0};
scanf("%d:%d:%d",&a.hour,&a.minute,&a.second);
int n;
scanf("%d",&n);
a.second+=n;
if(a.second>=60){
a.minute++;
a.second-=60;
}
if(a.minute>=60){
a.hour++;
a.minute-=60;
}
if(a.hour>=24){
a.hour-=24;
}
printf("%02d:%02d:%02d",a.hour,a.minute,a.second);
return 0;
}
6-1 计算两个复数之积
分数 15
本题要求实现一个计算复数之积的简单函数。
函数接口定义
struct complexmultiply(struct complex x, struct complex y);
其中struct complex是复数结构体,其定义如下:
structcomplex{int real;
int imag;
};
裁判测试程序样例
#include<stdio.h>
struct complex{int real;
int imag;
};
struct complex multiply(struct complex x, struct complex y);
int main(){
struct complex product, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
product = multiply(x, y);
printf("(%d+%di) * (%d+%di) = %d + %di\n",
x.real, x.imag, y.real, y.imag, product.real, product.imag);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
3 4 5 6
输出样例
(3+4i) * (5+6i) = -9 + 38i
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
struct complex multiply(struct complex x, struct complex y)
{
struct complex product={0};
product.real=x.real*y.real-x.imag*y.imag;
product.imag=x.real*y.imag+x.imag*y.real;
return product;
}
6-2 按等级统计学生成绩
分数 20
本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。
函数接口定义
intset_grade( struct student *p, int n );
其中p是指向学生信息的结构体数组的指针,该结构体的定义为:
struct student{
int num;
char name[20];
int score;
char grade;
};
n是数组元素个数。学号num、姓名name和成绩score均是已经存储好的。set_grade函数需要根据学生的成绩score设置其等级grade。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade还需要返回不及格的人数。
裁判测试程序样例
#include<stdio.h>
#define MAXN 10
struct student{
int num;
char name[20];
int score;
char grade;
};
int set_grade( struct student *p, int n );
int main(){ struct student stu[MAXN], *ptr;
int n, i, count;
ptr = stu;
scanf("%d\n", &n);
for(i = 0; i < n; i++){
scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
}
count = set_grade(ptr, n);
printf("The count for failed (<60): %d\n", count);
printf("The grades:\n");
for(i = 0; i < n; i++)
printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78
输出样例
The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int set_grade( struct student *p, int n )
{
int i=0;
int count=0;
for(i=0;i<n;i++)
{
if(p[i].score>=85&&p[i].score<=100)
{
p[i].grade='A';
}
if(p[i].score>=70&&p[i].score<=84)
{
p[i].grade='B';
}
if(p[i].score>=60&&p[i].score<=69)
{
p[i].grade='C';
}
if(p[i].score>=0&&p[i].score<=59)
{
p[i].grade='D';
count++;
}
}
return count;
}
6-3 Add Two Complex Numbers by Passing Structure to a Function
分数 15
This program takes two complex numbers as structures and adds them with the use of functions.
Function prototype
struct complexadd(struct complex n1, struct complex n2);
n1 and n2 are complex numbers.
Test code
#include<stdio.h>
struct complex{
float real;
float imag;
};
struct complex add(struct complex n1, struct complex n2);
int main(){
complex n1, n2, temp;
scanf("%f %f", &n1.real, &n1.imag);
scanf("%f %f", &n2.real, &n2.imag);
temp = add(n1, n2);
printf("Sum = %.1f + %.1fi", temp.real, temp.imag);
return 0;
}
/* Your code will be inserted here */
Sample of input
2.3 4.5
3.4 5
输出样例
Sum = 5.7 + 9.5i
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
struct complex add(struct complex n1, struct complex n2)
{
struct complex tmp={0};
tmp.real=n1.real+n2.real;
tmp.imag=n1.imag+n2.imag;
return tmp;
}
6-4 学生成绩比高低
分数 15
学生结构体定义如下:
struct Student{
int sid;
int C;
int English;
};
其中sid是学号,C是C语言课程成绩,English是英语课程成绩。学生的成绩按照这样的规则比较:
- 先比较两门课的总成绩,总成绩高的为优;
- 若总成绩相同,再比较C语言成绩,C语言成绩高的为优;
- 若C语言成绩也相同,则说明两名学生成绩相等。
编写函数实现成绩的比较。
函数接口定义
int compareScore(const struct Student *s1, const struct Student *s2);
其中s1和s2是传入的参数,分别指向两名学生的结构体变量。函数返回值为int型,
- 若s1所指学生成绩优于s2所指学生,返回1;
- 若s2所指学生成绩优于s1所指学生,返回-1;
- 若两学生成绩相等,返回0。
裁判测试程序样例
/* 此测试程序仅为示例,实际的测试程序可能不同。
注意:实际的测试程序可能有多组输入、进行多次比较,输入格式也有可能不同,
因此不要针对测试程序样例编写代码,而应当编写符合题目要求的函数 */
#include<stdio.h>
struct Student{
int sid;
int C;
int English;
};
int compareScore(const struct Student *s1, const struct Student *s2);
int main(){
struct Student zs, ls;
scanf("%d%d%d", &zs.sid, &zs.C, &zs.English);
scanf("%d%d%d", &ls.sid, &ls.C, &ls.English);
int r;
r = compareScore(&zs, &ls);
if(r < 0) printf("Less\n");
else if(r > 0) printf("Greater\n");
else printf("Equal\n");
return 0;
}
/* 你所编写的函数代码将被嵌在这里 */
输入样例1
对于样例测试程序的输入格式:
1 95 90
2 90 91
输出样例1
对于样例测试程序的输出格式:
Greater
输入样例2
对于样例测试程序的输入格式:
1 90 95
2 95 90
输出样例2
对于样例测试程序的输出格式:
Less
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int compareScore(const struct Student *s1, const struct Student *s2)
{
int a=0;
int b=0;
a=s1->C+s1->English;
b=s2->C+s2->English;
if(a>b||((a==b)&&s1->C>s2->C))
{
return 1;
}
if(a<b||((a==b)&&s1->C<s2->C))
{
return -1;
}
if(a==b)
{
return 0;
}
}
6-5 修改学生成绩
分数 15
输入n(n<50)个学生的成绩信息,再输入一个学生的学号、课程以及成绩,在自定义函数update_score()中修改该学生指定课程的成绩。
函数接口定义
int update_score(struct student *p, int n, int num, int course, int score);
其中p是结构指针,n是学生个数,course是课程序号,score是修改后的课程成绩。函数须返回指定学生的顺序位置,如果查无此人,返回-1。
裁判测试程序样例
#include<stdio.h>
struct student{/*学生信息结构定义*/
int num; /* 学号 */
char name[10]; /* 姓名 */
int math, english, computer; /* 三门课程成绩 */
};
int update_score(struct student *p, int n, int num, int course, int score); /*函数声明*/
int main(void){
int i, pos, n, num, course, score;
struct student students[50];/* 定义结构数组 */
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &students[i].num);
scanf("%s", students[i].name);
scanf("%d", &students[i].math);
scanf("%d", &students[i].english);
scanf("%d", &students[i].computer);
}
/* 输入待修改学生信息 */
scanf("%d", &num);
scanf("%d", &course);
scanf("%d", &score);
/*调用函数,修改学生成绩*/
pos = update_score(students, n, num, course, score);
/*输出修改后的学生信息*/
if(pos == -1)
printf("Not found!\n");
else { printf("%d,%d,%d,%d\n", students[pos].num, students[pos].math, students[pos].english, students[pos].computer);
}
return 0;
}
/* 请在这里填写答案 */
输入样例
3
101 Zhang 78 87 85
102 Wang 91 88 90
103 Li 75 90 84
102 2 89
输出样例
在这里给出相应的输出。例如:
102,91,89,90
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int update_score(struct student *p, int n, int num, int course, int score)
{
int i=0;
int index=-1;
for(i=0;i<n;i++)
{
if(p[i].num==num)
{
index=0;
int j=0;
if(course==1)
{
p[i].math=score;
}
if(course==2)
{
p[i].english=score;
}
if(course==3)
{
p[i].computer=score;
}
return i;
}
}
if(index==-1)
{
return -1;
}
}
7-1 学生信息的那些操作
(1)最高分,在哪里?
分数 10
从键盘输入若干个学生的信息,每个学生信息包括学号、姓名、3门课的成绩,计算每个学生的总分,输出总分最高的学生的信息。
输入格式
首先输入一个整数n(1<=n<=100),表示学生人数,然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及三个整数,表示语文、数学、英语三门课成绩,数据之间用空格隔开。
输出格式
输出总成绩最高的学生的学号、姓名、及三门课成绩,用空格隔开。若有多个最高分,只输出第一个。
输入样例
在这里给出一组输入。例如:
3
202016040201 Zhangling 89 78 95
202016040202 Wangli 85 87 99
202016040203 Fangfang 85 68 76
输出样例
在这里给出相应的输出。例如:
202016040202 Wangli 85 87 99
代码长度限制16 KB
时间限制1000 ms
内存限制64 MB
Solution
#include <stdio.h>
struct stu
{
char num[13];
char name[21];
int chinese;
int math;
int english;
};
int main()
{
int n=0;
scanf("%d",&n);
struct stu p[n];
int max=p[0].chinese+p[0].math+p[0].english;
int a=0;
int i=0;
for(i=0;i<n;i++)
{
scanf("%s %s %d %d %d",p[i].num,p[i].name,&p[i].chinese,&p[i].math,&p[i].english);
}
for(i=0;i<n;i++)
{
if(p[i].chinese+p[i].math+p[i].english>max)
{
max=p[i].chinese+p[i].math+p[i].english;
a=i;
}
}
printf("%s %s %d %d %d",p[a].num,p[a].name,p[a].chinese,p[a].math,p[a].english);
return 0;
}
7-2 学生信息的那些操作
(2)按学号,查个人
分数 10
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下查找功能:输入一个学生的学号,输出该学生学号、姓名、3门课程成绩
输入格式
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个学号num
输出格式
若学号num存在,输出该学生的学号、姓名、3门课程成绩;若该学号不存在,则输出Not Found。
输入样例
在这里给出一组输入。例如:
3
202016040201 Zhangling 89 78 95
202016040202 Wangli 85 87 99
202016040203 Fangfang 85 68 76
202016040201
输出样例
在这里给出相应的输出。例如:
202016040201 Zhangling 89 78 95
代码长度限制16 KB
时间限制1000 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <string.h>
struct stu
{
char num[13];
char name[21];
int a;
int b;
int c;
};
int main()
{
int n=0;
scanf("%d",&n);
struct stu p[n];
char num1[13]={0};
int index=-1;
int i=0;
for(i=0;i<n;i++)
{
getchar();
scanf("%s %s %d %d %d",p[i].num,p[i].name,&p[i].a,&p[i].b,&p[i].c);
}
getchar();
scanf("%s",num1);
for(i=0;i<n;i++)
{
if(strcmp(p[i].num,num1)==0)
{
index=0;
printf("%s %s %d %d %d",p[i].num,p[i].name,p[i].a,p[i].b,p[i].c);
}
}
if(index==-1)
{
printf("Not Found");
}
return 0;
}
7-3 学生信息的那些操作
(3)按姓名,查个人
分数 10
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下查找功能:输入一个学生的姓名,输出该学生学号、姓名、3门课程成绩
输入格式
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个姓名name。
输出格式
若姓名name存在,输出所有该姓名学生的学号、姓名、3门课程成绩;若该姓名不存在,则输出Not Found。
输入样例
在这里给出一组输入。例如:
3
202016010101 Hanmeimei 89 78 95
202016040201 Lilei 85 87 99
202016040202 Hanmeimei 85 68 76
Hanmeimei
输出样例
在这里给出相应的输出。例如:
202016010101 Hanmeimei 89 78 95
202016040202 Hanmeimei 85 68 76
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <string.h>
struct stu
{
char num[13];
char name[21];
int a;
int b;
int c;
};
int main()
{
int n=0;
scanf("%d",&n);
struct stu p[n];
char name[21]={0};
int index=-1;
int i=0;
for(i=0;i<n;i++)
{
getchar();
scanf("%s %s %d %d %d",p[i].num,p[i].name,&p[i].a,&p[i].b,&p[i].c);
}
getchar();
scanf("%s",name);
for(i=0;i<n;i++)
{
if(strcmp(p[i].name,name)==0)
{
index=0;
printf("%s %s %d %d %d\n",p[i].num,p[i].name,p[i].a,p[i].b,p[i].c);
}
}
if(index==-1)
{
printf("Not Found");
}
return 0;
}
7-4 学生信息的那些操作
(4)不知姓,也能查
分数 10
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下查找功能:输入学生的姓名的部分信息,也能实现信息查询。比如,隔壁班的MM,你只听别人叫她“梅梅”,暗自查一下才知道MM叫“韩梅梅”,而且是学霸。
输入格式
第一行输入一个n(n小于100)代表学生个数,接下来n行每行输入学号(12位),姓名(不超过20位),3门课的成绩(不超过100)。
最后输入一个姓名name。
输出格式
输出所有姓名中含有name的学生信息,包括学号,姓名,3门课成绩,中间用空格隔开。
如果没有请输出Not Found。
注:包含指子串。
输入样例
在这里给出一组输入。例如:
3
202016040201 Hanmeimei 89 78 95
202016040202 Wangli 85 87 99
202016040203 Fangfang 85 68 76
meimei
输出样例
在这里给出相应的输出。例如:
202016040201 Hanmeimei 89 78 95
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <string.h>
struct stu
{
char num[13];
char name[21];
int a;
int b;
int c;
};
int main()
{
int n=0;
scanf("%d",&n);
struct stu p[n];
char name[21]={0};
int index=-1;
int i=0;
for(i=0;i<n;i++)
{
getchar();
scanf("%s %s %d %d %d",p[i].num,p[i].name,&p[i].a,&p[i].b,&p[i].c);
}
getchar();
scanf("%s",name);
for(i=0;i<n;i++)
{
char* ret=strstr(p[i].name,name);
if(ret!=NULL)
{
index=0;
printf("%s %s %d %d %d\n",p[i].num,p[i].name,p[i].a,p[i].b,p[i].c);
}
}
if(index==-1)
{
printf("Not Found");
}
return 0;
}
7-7 学生信息的那些操作
(7)单科成绩排序
分数 10
有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<=i<=3),则按第i门课成绩降序输出成绩表。
输入格式
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。
输出格式
输出按第i门课降序排序的结果,格式见样例。
输入样例
在这里给出一组输入。例如:
3
202016040201 Zhangling 89 78 95
202016040202 Wangli 85 87 99
202016040203 Fangfang 85 68 76
1
输出样例
在这里给出相应的输出。例如:
202016040201 Zhangling 89 78 95
202016040202 Wangli 85 87 99
202016040203 Fangfang 85 68 76
代码长度限制16 KB
时间限制1000 ms
内存限制64 MB
Solution
#include <stdio.h>
#include <stdlib.h>
struct stu
{
char num[13];
char name[21];
int a;
int b;
int c;
};
int cmp_struct1(const void* e1,const void* e2)
{
return ((struct stu*)e2)->a-((struct stu*)e1)->a;
}
int cmp_struct2(const void* e1,const void* e2)
{
return ((struct stu*)e2)->b-((struct stu*)e1)->b;
}
int cmp_struct3(const void* e1,const void* e2)
{
return ((struct stu*)e2)->c-((struct stu*)e1)->c;
}
int main()
{
int n=0;
int x;
scanf("%d",&n);
struct stu p[n];
int i=0;
for(i=0;i<n;i++)
{
scanf("%s %s %d %d %d",p[i].num,p[i].name,&p[i].a,&p[i].b,&p[i].c);
}
scanf("%d",&x);
if(x==1)
{
qsort(p,n,sizeof(p[0]),cmp_struct1);
}
if(x==2)
{
qsort(p,n,sizeof(p[0]),cmp_struct2);
}
if(x==3)
{
qsort(p,n,sizeof(p[0]),cmp_struct3);
}
for(i=0;i<n;i++)
{
printf("%s %s %d %d %d \n",p[i].num,p[i].name,p[i].a,p[i].b,p[i].c);
}
return 0;
}
7-6 寻找250
分数 10
对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。
输入格式
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。
输出格式
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。
输入样例
888 666 123 -233 250 13 250 -222
输出样例
5
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
int main()
{
int arr[100000];
int i=0;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if(arr[i]==250)
{
printf("%d",i+1);
return 0;
}
}
return 0;
}
7-5 求整数段和
分数 10
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
输入样例
-3 8
输出样例
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
int main()
{
int a=0;
int b=0;
scanf("%d %d",&a,&b);
int i=0;
int sum=0;
int count=1;
for(i=a;i<=b;i++)
{
printf("%5d",i);
if(count%5==0||i==b)
{
printf("\n");
}
sum+=i;
count++;
}
printf("Sum = %d",sum);
return 0;
}
7-4 谁是赢家
分数 10
某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。
输入格式
输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。
输出格式
按以下格式输出赢家:
The winner is x: P1 + P2
其中 x 是代表赢家的字母,P1 是赢家得到的观众票数,P2 是赢家得到的评委票数。
输入样例
327 129
1 0 1
输出样例
The winner is a: 327 + 1
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
#include <stdio.h>
int main()
{
int pa=0;
int pb=0;
scanf("%d %d",&pa,&pb);
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
if((pa>pb&&x+y+z<3)||(pa<pb&&x+y+z==0))
{
printf("The winner is a: %d + %d",pa,3-x-y-z);
}
if((pb>pa&&x+y+z>=1)||(pb<pa&&x+y+z==3))
{
printf("The winner is b: %d + %d",pb,x+y+z);
}
return 0;
}
6-1 使用递归函数计算1到n之和
分数 10
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。
函数接口定义
int sum( int n );
该函数对于传入的正整数n返回1+2+3+…+n的和;若n不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。
裁判测试程序样例
#include <stdio.h>
int sum( int n );
int main(){
int n;
scanf("%d", &n);
printf ("%d\n", sum(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1
10
输出样例1
55
输入样例2
0
输出样例2
0
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int sum( int n )
{
int sum1=0;
if(n<=0)
{
return 0;
}
else
{
sum1=sum(n-1)+n;
}
return sum1;
}
6-2 递归实现指数函数
分数 15
本题要求实现一个计算xn(n≥1)的函数。
函数接口定义
double calc_pow( double x, int n );
函数calc_pow应返回x的n次幂的值。建议用递归实现。题目保证结果在双精度范围内。
裁判测试程序样例
#include <stdio.h>
double calc_pow( double x, int n );
int main(){
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.0f\n", calc_pow(x, n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
2 3
输出样例
8
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
double calc_pow( double x, int n )
{
int sum=1;
if(n>=1)
{
sum=x*calc_pow(x,n-1);
}
return sum;
}
6-3 递归计算Ackermenn函数
分数 15
本题要求实现Ackermenn函数的计算,其函数定义如下:
函数接口定义
intAck( int m, int n );
其中m和n是用户传入的非负整数。函数Ack返回Ackermenn函数的相应值。题目保证输入输出都在长整型
范围内。
裁判测试程序样例
#include<stdio.h>intAck( int m, int n );
intmain(){
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", Ack(m, n));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例
2 3
输出样例
9
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int Ack( int m, int n )
{
int sum=0;
if(m==0)
{
sum=n+1;
}
if(n==0&&m>0)
{
sum=Ack(m-1,1);
}
if(m>0&&n>0)
{
sum=Ack(m-1,Ack(m,n-1));
}
return sum;
}
6-4 递归求Fabonacci数列
分数 10
本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
函数接口定义
int f( int n );
函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。
裁判测试程序样例
#include <stdio.h>
int f( int n );
int main(){
int n;
scanf("%d", &n);
printf("%d\n", f(n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
6
输出样例
8
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
int f( int n )
{
long long sum=0;
if(n==0)
{
sum=0;
}
if(n==1)
{
sum=1;
}
if(n!=0&&n!=1)
{
sum=f(n-2)+f(n-1);
}
return sum;
}
6-8 递归计算P函数
分数 15
本题要求实现下列函数P(n,x)的计算,其函数定义如下:
函数接口定义
doubleP( int n, double x );
其中n是用户传入的非负整数,x是双精度浮点数。函数P返回P(n,x)函数的相应值。题目保证输入输出都在双精度范围内。
裁判测试程序样例
#include<stdio.h>doubleP( int n, double x );
intmain(){
int n;
double x;
scanf("%d %lf", &n, &x);
printf("%.2f\n", P(n,x));
return0;
}
/* 你的代码将被嵌在这里 */
输入样例
10 1.7
输出样例
3.05
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
Solution
double P( int n, double x )
{
double sum=0;
if(n==0)
{
sum=1;
}
if(n==1)
{
sum=x;
}
if(n>1)
{
sum=((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))*1.0/n;
}
return sum;
}
6-1 两整数排序(降序)
分数 10
请编写函数,对两个整数按降序排序。
函数原型
void IntSortDsc(int *x, int *y);
说明:参数 x 和 y 为指示两个整型变量的指针,函数值对这两个变量进行排序,使 x 和 y 所指变量的值按由大到小的顺序排列。
裁判程序
#include <stdio.h>
void IntSwap(int *x, int *y);
void IntSortDsc(int *x, int *y);
int main()
{
int a, b; scanf("%d %d", &a, &b);
IntSortDsc(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
void IntSwap(int *x, int *y) { ...(略)... } /* 你提交的代码将被嵌在这里 */
输入样例
-15 27
输出样例
27 -15
要求:调用前面作业中的 IntSwap 函数交换两个整数的值。
关联习题:交换整数。
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Solution
void IntSortDsc(int *x, int *y)
{
if (*x < *y)
{
IntSwap(x, y);
}
}
6-2 计算两数的和与差
分数 10
本题要求实现一个计算输入的两数的和与差的简单函数。
函数接口定义:
void sum_diff( float op1, float op2, float *psum, float *pdiff );
其中op1
和op2
是输入的两个实数,*psum
和*pdiff
是计算得出的和与差。
裁判测试程序样例:
#include <stdio.h>
void sum_diff( float op1, float op2, float *psum, float *pdiff );
int main()
{
float a, b, sum, diff;
scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4 6
输出样例:
The sum is 10.00
The diff is -2.00
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Solution
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum = op1 + op2;
*pdiff = op1 - op2;
}
6-3 使用函数找出数组中的最大值
分数 10
本题要求实现一个找出整型数组中最大值的函数。
函数接口定义:
int FindArrayMax( int a[], int n );
其中a
是用户传入的数组,n
是数组a
中元素的个数。函数返回数组a
中的最大值。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int FindArrayMax( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
{
scanf("%d", &a[i]);
}
printf("%d\n", FindArrayMax(a, n));
return 0;
}
/* 请在这里填写答案 */
输入样例:
4
20 78 99 -14
输出样例:
99
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Solution
#include<limits.h>
int FindArrayMax( int a[], int n )
{
int res = INT_MIN;
for (int i = 0; i < n; i ++ )
{
if (res < a[i]) res = a[i];
}
return res;
}
6-4 在数组中查找指定元素
分数 15
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]
是用户传入的数组;n
(≥0)是list[]
中元素的个数;x
是待查找的元素。如果找到
则函数search
返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x; int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
else printf("Not found\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
1 2 2 5 4
2
输出样例1:
index = 1
输入样例2:
5
1 2 2 5 4
0
输出样例2:
Not found
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Solution
int search( int list[], int n, int x )
{
int t = -1;
for (int i = 0; i < n; i ++ )
{
if (list[i] == x)
{
t = i;
break;
}
}
return t;
}
6-5 查找星期
本题要求实现函数,可以根据下表查找到星期,返回对应的序号。
序号 | 星期 |
---|---|
0 | Sunday |
1 | Monday |
2 | Tuesday |
3 | Wednesday |
4 | Thursday |
5 | Friday |
6 | Saturday |
函数接口定义:
int getindex( char *s );
函数getindex
应返回字符串s
序号。如果传入的参数s
不是一个代表星期的字符串,则返回-1。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 80
int getindex( char *s );
int main()
{
int n;
char s[MAXS];
scanf("%s", s);
n = getindex(s);
if ( n==-1 ) printf("wrong input!\n");
else printf("%d\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
Tuesday
输出样例1:
2
输入样例2:
today
输出样例2:
wrong input!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Solution
int getindex( char *s )
{
if (!strcmp(s, "Sunday")) return 0;
else if (!strcmp(s, "Monday")) return 1;
else if (!strcmp(s, "Tuesday")) return 2;
else if (!strcmp(s, "Wednesday")) return 3;
else if (!strcmp(s, "Thursday")) return 4;
else if (!strcmp(s, "Friday")) return 5;
else if (!strcmp(s, "Saturday")) return 6;
else return -1;
}
6-6 字符串的连接
本题要求实现一个函数,将两个字符串连接起来。
函数接口定义:
char *str_cat( char *s, char *t );
函数str_cat
应将字符串t
复制到字符串s
的末端,并且返回字符串s
的首地址。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 10
char *str_cat( char *s, char *t );
int main()
{
char *p;
char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
scanf("%s%s", str1, str2);
p = str_cat(str1, str2);
printf("%s\n%s\n", p, str1);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
abc
def
输出样例:
abcdef
abcdef
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Solution
char *str_cat( char *s, char *t )
{
strcat(s, t);
return s;
}
7-1 输出平均分最高的学生信息
假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(1<=n<=10)个学生的成绩信息,计算并输出平均分最高的学生信息,平均分保留两位小数。如果平均分最高的学生有多个,按输入顺序输出第一个学生的信息。
输入格式
输入整数n(1<=n<=10),在下面n行输入n个学生的信息,包括学号、姓名、三门课程成绩(整数)。
输出格式
在一行中输出平均分最高的学生信息:学号、姓名、平均分(保留两位小数)。
输入样例
3
101 Zhang 78 87 85
102 Wang 91 88 90
103 Li 75 90 84
输出样例
num:102,name:Wang,average:89.67
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Solution
#include<bits/stdc++.h>
using namespace std;
struct node{
int id;
char name[20];
int a, b, c;
double s;
}a[20];
bool cmp(const node &a, const node &b)
{
return a.s > b.s;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++ )
{
cin >> a[i].id >> a[i].name >> a[i].a >> a[i].b >> a[i].c;
a[i].s = (a[i].a + a[i].b + a[i].c) / 3.0;
}
sort(a, a + n, cmp);
printf("num:%d,name:%s,average:%.2f", a[0].id, a[0].name, a[0].s);
return 0;
}