写在前面
参考代码可以解决全部的测试点,礼貌借鉴哦,最好是自己看懂了以后,能够独立敲出来,最少也得改个变量名什么的比较好。如有任何问题或者看不懂的,欢迎私信或者评论,我们理性讨论!
数组
4-1.计算平均分并输出低于平均分的成绩
计算全班n个(n≤30)学生的平均分,输出平均分以及低于平均分的成绩。
输入格式:
先输入整数n,再依次输入n个整数成绩,以空格间隔。
输出格式:
在第一行下列格式输出平均分。(result保留小数点后两位)
average=result
在下一行依次输出低于平均分的成绩,每个成绩后跟一个空格。(注意最后一个数后面有一个空格)
输入样例:
20
67 78 77 45 97 65 53 90 75 88 85 76 72 75 87 56 96 92 44 70
输出样例:
average=74.40
67 45 65 53 72 56 44 70
参考代码:
#include <stdio.h>
int main()
{
int n;
int sum = 0;
scanf("%d", &n);
int score[40];
for (int i = 0; i < n; i++)
scanf("%d", &score[i]);
for (int i = 0; i < n; i++)
sum += score[i];
double ave;
ave =1.0 * sum / n;
printf("average=%.2lf\n", ave);
for (int i = 0; i < n; i++) {
if (score[i] < ave)
printf("%d ", score[i]);
}
return 0;
}
4-2.逆序存放数组中的数据,并输出指定元素
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按要求输出指定的数组元素。
输入格式:
在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。第三行输入一个非负整数m(m<n)。
输出格式:
在一行中输出逆序存放后下标为m的数组元素。行末无空格。
输入样例:
6
10 8 1 2 3 4
2
输出样例:
2
参考代码:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int num[40];
for (int i = n - 1; i >= 0; i--)
scanf("%d", &num[i]);
int m;
scanf("%d", &m);
printf("%d", num[m]);
return 0;
}
4-3.求数组中第二大的元素
无需排序,求数组中第二大的元素。
输入格式:
在一行中输入10个整数,以空格分隔。
输出格式:
直接输出第二大的值。
输入样例:
81 78 80 67 85 42 86 82 90 73
输出样例:
86
参考代码:
#include <stdio.h>
int main()
{
int num[10];
for (int i = 0; i < 10; i++)
scanf("%d", &num[i]);
int max = num[0];
int sec_max = num[1];
for (int i = 0; i < 10; i++) {
if (num[i] > max) {
sec_max = max;
max = num[i];
}
else if (num[i] > sec_max) {
sec_max = num[i];
}
}
printf("%d", sec_max);
return 0;
}
4-4.求二维数组中的最大值和最小值
编写程序,输入一个3×3的二维整数数组,输出其中最大值、最小值。
输入格式:
输入9个整型数到二维数组a[3][3],数据之间用一个空格分隔。
输出格式:
输出数组a的最大值和最小值
输入样例:
1 2 3 4 5 6 7 8 9
输出样例:
max=9 min=1
参考代码:
#include <stdio.h>
int main()
{
int a[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
}
int max = a[0][0];
int min = a[0][1];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (a[i][j] > max)
max = a[i][j];
else if (a[i][j] < min)
min = a[i][j];
}
}
printf("max=%d min=%d", max, min);
return 0;
}
4-5.按字母顺序排列出场国家名称
从键盘输入多个国家的名称,编写程序按字母顺序排列出场次序,并按出场顺序输出各国家名称。
输入格式:
第1行输入1个整数n(0≤n≤20),表示出场国家数量;之后 n行,每行输入1个国家名称(国家名称长度不超过20,可含空格)。
输出格式:
按字母序输出n行国家名称。若输入国家数n不合题意,则输出“Data Error”;若国家数为0,无输出。
输入样例:
5
Romania
United Kingdom
America
China
Brazil
输出样例:
America
Brazil
China
Romania
United Kingdom
参考代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
char country[20][20];
if (n == 0)
return 0;
if (n > 20 || n < 0) {
printf("Data Error");
return 0;
}
gets(country[0]);
for (int i = 0; i < n; i++) {
gets(country[i]);
}
char temp[20];
for (int i = 0; i < n - 1; i++) {
for (int j = 1 + i; j < n; j++) {
if (strcmp(country[i], country[j]) > 0) {
strcpy(temp, country[i]);
strcpy(country[i], country[j]);
strcpy(country[j], temp);
}
}
}
for (int i = 0; i < n; i++)
puts(country[i]);
return 0;
}
4-6.二进制数据转换成十进制数
输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。
输入格式:
输入1个二进制数串(至少1位且不超过16位)。
输出格式:
输出转换后的十进制数。
输入样例:
0110110001100
输出样例:
3468
参考代码:
#include <stdio.h>
#include <math.h>
int main()
{
char a[17];
gets(a);
int n = strlen(a);
int sum = 0;
for (int i = 0, j = n - 1; i < n; i++, j--) {
sum += (a[i] - '0') * pow(2, j);
}
printf("%d", sum);
return 0;
}
函数和指针
5-1.求实数和的函数
本题要求实现一个函数,求给定的N个实数的和。
函数接口定义:
float sum (float data[], int N );
其中给定实数存放在数组 data[] 中,正整数N是数组元素个数。该函数须返回N个 data[] 元素的和。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
float sum ( float data[], int N );
int main ()
{
int n, i;
float data[MAXN];
scanf("%d", &n);
for ( i=0; i<n; i++ )
scanf("%f", &data[i]);
printf("%.2f\n", sum( data, n));
return 0;
}
/* 请在这里填写答案 */
输入样例:
3
12.3 45.6 -67.8
输出样例:
在这里给出相应的输出。例如:
-9.90
参考代码:
float sum(float data[], int N) {
float sum = 0.0;
for (int i = 0; i < N; i++)
sum += data[i];
return sum;
}
5-2.求解一元二次方程实根的函数
要求计算一元二次方程ax2+bx+c=0(a=0)的根。
主函数中给出3个浮点系数a、b、c,调用函数rootOfEquation()求解方程的实根。方程的根通过指针类型的参数x1、x2传回主函数,其中x1是值较大的根,x2是值较小的根。
1.若方程有两个相等的实根,函数返回1;
2.若方程有两个不等的实根,函数返回2;
3.若方程无实根,函数返回0。
函数接口定义:
int rootOfEquation(double a, double b, double c, double *x1, double *x2);
其中给定实数存放在数组 data[] 中,正整数N是数组元素个数。该函数须返回N个 data[] 元素的和。
裁判测试程序样例:
#include<stdio.h>
#include<math.h>
int rootOfEquation(double a, double b, double c, double *x1, double *x2);
int main()
{ double a,b,c;
double x1,x2;
scanf("%lf %lf %lf",&a,&b,&c);
int flag;
flag=rootOfEquation(a,b,c,&x1,&x2);
if(flag==0)
printf("方程无实根");
else if(flag==1)
printf("方程有两个相等的实根 x1=x2=%.2f", x1);
else
printf("方程有两个不等的实根 x1=%.2f,x2=%.2f", x1, x2);
return 0;
}
/* 请在这里填写答案 */
输入样例:
1 3 2
输出样例:
方程有两个不等的实根 x1=-1.00,x2=-2.00
参考代码:
int rootOfEquation(double a, double b, double c, double *x1, double *x2){
double flag = pow(b, 2) - 4 * a * c;
if (flag < 0.0)
return 0;
else if (flag == 0.0){
*x1 = -b / (2 * a);
return 1;
}
else if (flag > 0.0){
*x1 = (-b + pow(flag, 0.5)) / (2 * a);
*x2 = (-b - pow(flag, 0.5)) / (2 * a);
return 2;
}
}
5-3.计算Fibonacci数列每一项时所需的递归调用次数
计算并打印Fibonacci数列每一项时所需的递归调用次数,数列第一项从1开始。
要求:
1)定义表示调用次数的全局变量count;
2)定义用递归方法求Fibonacci数列的Fib()函数。
函数接口定义:
long Fib(int a);
其中给定实数存放在数组 data[] 中,正整数N是数组元素个数。该函数须返回N个 data[] 元素的和。
裁判测试程序样例:
#include <stdio.h>
long Fib(int a);
/* 你的代码将被嵌在这里 */
int main()
{
int n, i, x;
printf("Input n:");
scanf("%d", &n);
for (i=1; i<=n; i++)
{
count = 0; //计算下一项Fibonacci数列时将计数器count清零
x = Fib(i);
printf("Fib(%d)=%d, count=%d\n", i, x, count);
}
return 0;
}
输入样例:
3
输出样例:
Fib(1)=1, count=1
Fib(2)=1, count=1
Fib(3)=2, count=3
参考代码:
int count;
long Fib(int a) {
if (a == 1 || a == 2){
count += 1;
return 1;
}
else{
count += 1;
return Fib(a - 1) + Fib(a - 2);
}
}
5-4.字符串加密
本题要求实现一个函数,能对一行字符串(字符串的长度<80)加密。
加密函数采用的加密算法:如果不是英文字母,就不加密,原样显示;否则就将字母加上一个偏移值5实现加密。注意大小写英文字母分别构成一个封闭环,如字符‘w’,加密后为字符‘b’。
函数接口定义:
void cryptograp(char ch[],int n);
其中给定实数存放在数组 data[] 中,正整数N是数组元素个数。该函数须返回N个 data[] 元素的和。
裁判测试程序样例:
#include<stdio.h>
#include<string.h>
void cryptograp(char ch[],int n); //加密函数
int main()
{
int count = 0;
char text[80] = {'\0'}; //存放明文字符串
gets(text);
count = strlen(text);
cryptograp(text,count);
printf("加密后的密文是:\n%s\n", text);
return 0;
}
/* 请在这里填写答案 */
输入样例:
Hello World!
输出样例:
加密后的密文是:
Mjqqt Btwqi!
参考代码:
void cryptograp(char ch[], int n) {
for (int i = 0; i < n; i++) {
if ('a' <= ch[i] && ch[i] <= 'u')
ch[i] += 5;
else if ('v' <= ch[i] && ch[i] <= 'z')
ch[i] -= 21;
else if ('A' <= ch[i] && ch[i] <= 'U')
ch[i] += 5;
else if ('V' <= ch[i] && ch[i] <= 'Z')
ch[i] -= 21;
}
}
选择结构
1-1.能买手机吗?
小吴同学想换一部手机,希望自己自力更生获得。于是,小吴准备暑假兼职获取酬劳。今天看到一则招聘启示,薪资标准为:每周工作40小时以内,每小时基本工资20元;超出时间为加班,每小时工资翻倍。公司规定,每周加班不能超过10小时。
现在,小吴想知道,若在此公司工作,要在一个月内(4周)挣到购买手机的资金,需要工作的时长。请你编写一个程序,替小吴算算,购买不同的手机需要加班的最短时长。
输入格式:
输入小吴想买的手机价格Price,Price为正整数。
输出格式:
给出是否需要加班的结论。若需要加班,给出需加班时长(整数)。并给出是否能购买此手机的建议。
输入样例 1:
2000
输出样例1
不需加班,可购买
输入样例 2:
5000
输出样例 2:
需加班45小时,买不起
输入样例 3:
4500
输出样例 3:
需加班33小时,可购买
参考代码:
#include <stdio.h>
int main()
{
int price;
scanf("%d", &price);
if (price <= 40 * 20 * 4)
printf("不需加班,可购买");
else{
int day = (price - 40 * 20 * 4) / 40;
int change = (price - 40 * 20 * 4) % 40;
if (change != 0)//判断是否需要向上取整
day ++;
if (day <= 40)
printf("需加班%d小时,可购买", day);
else
printf("需加班%d小时,买不起", day);
}
return 0;
}
1-2.判断输入的字符是哪种类型
通过键盘输入一个字符,编程判断并输出用户输入的是什么类型的字符。
输入格式:
输入一个字符。
输出格式:
在一行中输出该字符是哪种类型的字符。
若用户输入字符为'0'和'9'之间,输出This is a digit.
若用户输入字符在'A'和'Z'之间,输出This is a capital letter.
若用户输入字符在'a'和'z'之间,输出This is a small letter.
其他情况,输出Other character.
输入样例:
6
输出样例:
This is a digit.
参考代码:
#include <stdio.h>
int main()
{
int x;
x = getchar();
if (x >= '0' && x <= '9')
printf("This is a digit.");
else if (x >= 'A' && x <= 'Z')
printf("This is a capital letter.");
else if (x >= 'a' && x <= 'z')
printf("This is a small letter.");
else
printf("Other character.");
return 0;
}
1-3.判断BMI指数
BMI指数(Body Mass Index,即身体质量指数),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。当我们需要比较及分析一个人的体重对于不同高度的人所带来的健康影响时,BMI值是一个中立而可靠的指标。本题要求根据输入的身高与体重,计算对应的BMI指数,并给出相应的结论。
输入格式:
输入在一行中依次给出2个浮点数,分别对应身高(单位:米)与体重(单位:公斤),中间用空格间隔。
输出格式:
按如下格式输出对应的BMI指数(保留一位小数)与结论
BMI = BMI计算结果
结论
其中结论的输出规则如下:
BMI<18.5,输出"Under Weight"
18.5 ≤ BMI < 24,输出"Normal"
24 ≤ BMI < 28,输出"Over Weight"
28 ≤ BMI < 32,输出"Fat"
BMI ≥ 32,输出"Too Fat"
输入样例:
1.74 76.5
输出样例:
BMI = 25.3
Over Weight
参考代码:
#include <stdio.h>
#include <math.h>
int main()
{
float height, weight;
scanf("%f %f", &height, &weight);
float BMI = weight / pow(height, 2);
if (BMI < 18.5)
printf("BMI = %.1f\nUnder Weight", BMI);
else if (BMI >= 18.5 && BMI < 24)
printf("BMI = %.1f\nNormal", BMI);
else if (BMI >= 24 && BMI < 28)
printf("BMI = %.1f\nOver Weight", BMI);
else if (BMI >= 28 && BMI < 32)
printf("BMI = %.1f\nFat", BMI);
else
printf("BMI = %.1f\nToo Fat", BMI);
return 0;
}
1-4.输出英文字母的前驱和后继字母
从键盘输入一个英文字母,输出其前驱字母(即前一个字母)、后继字母(即后一个字母)及其ASCII值。比如输入的字母是b,则前驱字母是a,后继字母是c。而如果输入的字母是a,则前驱字母是z,后继字母是b;如果输入的字母是z,则前驱字母是y,后继字母是a。
大写字母的前驱后继字母求法与小写字母相同。
输入格式:
输入一个英文字母(大写或小写字母)。
输出格式:
第一行输出该字母的前驱字母及其ASCII值,第二行输出后继字母及其ASCII值,字母与ASCII值之间用一个空格分隔。
输入样例1:
b
输出样例1:
a 97
c 99
输入样例2:
a
输出样例2:
z 122
b 98
参考代码:
#include <stdio.h>
#include <math.h>
int main()
{
char a1, a2, a3;
scanf("%c", &a2);
a1 = a2 - 1;
a3 = a2 + 1;
if (a2 == 'a') a1 = 'z';
if (a2 == 'A') a1 = 'Z';
if (a2 == 'z') a3 = 'a';
if (a2 == 'Z') a3 = 'A';
printf("%c %d\n%c %d", a1, a1, a3, a3);
return 0;
}
顺序结构
2-1.计算整数各位数字之和
输入一个3位正整数,将其每一位的数字相加,输出和。
输入格式:
输入一个3位正整数。
变量数据类型为unsigned。
输出格式:
输出整数每一位相加后的整数和。
输入样例:
123
输出样例:
6
参考代码:
#include <stdio.h>
int main()
{
int n, sum;
scanf("%d", &n);
int a = n / 100;
int b = n / 10 % 10;
int c = n % 10;
sum = a + b + c;
printf("%d", sum);
return 0;
}
2-2.杨辉三角
请按照如下方式输出杨辉三角:
输入格式:
无输入。
输出格式:
每个数字前面先输出两个空格,每一行从第一列开始输出。
输入样例1:
无
输出样例1:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
参考代码:
#include<stdio.h>
int main()
{
printf(" 1\n");
printf(" 1 1\n");
printf(" 1 2 1\n");
printf(" 1 3 3 1\n");
printf(" 1 4 6 4 1\n");
return 0;
}
2-3.计算代数表达式
输入x值,根据公式计算y的值。
输入格式:
输入角度x(注意:计算时,需将其转换为弧度)。变量数据类型为double。π为3.14159。
输出格式:
输出y的值,精确到小数点后2位。
输入样例:
12.3
输出样例:
1.69
参考代码:
#include <stdio.h>
#include <math.h>
#define pi 3.14159
#define DEC (pi / 180)
int main()
{
double x, y;
scanf("%lf", &x);
y = pow((sin(60 * DEC) + 1) * (sin(30 * DEC) + 1) / cos(x * DEC), 0.5);
printf("%.2f", y);
return 0;
}
循环结构
3-1.求cosx的近似值
已知cosx的近似计算公式如下:
其中x为弧度,n为整数(0≤n≤100)。
现编写程序,根据用户输入的x和n的值,利用上述近似计算公式计算cosx的近似值(为保证数据准确,使用双精度浮点类型),输出结果时要求保留小数点后6位。
输入格式:
输入表示弧度的实数 x ,以及整数 n。
输出格式:
按“cos(x)=近似值”格式输出计算结果,保留小数点后6位。
输入样例:
1.5 3
输出样例:
cos(1.500000)=0.070117
参考代码:
#include <stdio.h>
#include <math.h>
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
double result = 1;
double flag = 1;
for (int i = 1; i <= n; i++)
{
flag *= (-1) * pow(x, 2) / (2 * i * (2 * i - 1));
result += flag;
}
printf("cos(%.6lf)=%.6lf", x, result);
return 0;
}
3-2.评委评分
某次比赛有n个评委对参赛选手打分。编程输入各个评委的评分,去掉一个最高分和1个最低分后,输出该选手的平均分。
输入格式:
输入在第一行中给出正整数n,在第二行给出n个0~10之间的浮点数,用空格分开。
输出格式:
在一行中输出去掉最高分和最低分之后的平均分,精确到小数点后2位。
输入样例:
7
9 8 8.5 7 7.9 9.5 8.9
输出样例:
8.46
参考代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
float max = 00.0;
float min = 10.0;
float score;
float sum = 0;
for (int i = 1; i <= n; i++)
{
scanf("%f", &score);
sum += score;
if (score > max)
max = score;
if (score < min)
min = score;
}
printf("%.2f", (sum - max - min) / (n - 2));
return 0;
}
3-3.简写转全称
在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:
每个简写字母对应一行输出
若字符为C或c,则该行输出"BEIJING OLYMPIC GAMES"
若字符为J或j,则该行输出"JAPAN WORLD CUP"
若字符为K或k,则该行输出"KOREA WORLD CUP"
若为其他字符,则该行原样输出该字符。
输入格式:
输入在一行中输入若干个字符,字符之间没有空格间隔,以回车结束。
输出格式:
按题目要求产生若干行输出。
输入样例:
kijckj
输出样例:
KOREA WORLD CUP
i
JAPAN WORLD CUP
BEIJING OLYMPIC GAMES
KOREA WORLD CUP
JAPAN WORLD CUP
参考代码:
#include <stdio.h>
int main()
{
char s[50];
gets(s);
int n = strlen(s);
for (int i = 0; i < n; i++) {
if (s[i] == 'c' || s[i] == 'C')
printf("BEIJING OLYMPIC GAMES\n");
else if (s[i] == 'j' || s[i] == 'J')
printf("JAPAN WORLD CUP\n");
else if (s[i] == 'k' || s[i] == 'K')
printf("KOREA WORLD CUP\n");
else
printf("%c\n", s[i]);
}
return 0;
}
3-4.统计整数的位数
从键盘读入一个整数,统计该数的位数。例如,输入12534,输出5;输入-99,输出2;输入0,输出1。
输入格式:
输入一个整数N(−105 ≤N≤ 105)。
输出格式:
在一行中按如下格式输出该数的位数。
It contains 位数 digits.
输入样例:
12534
输出样例:
It contains 5 digits.
参考代码:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int digit = 0;
if (n == 0)
digit = 1;
while (n) {
n /= 10;
digit += 1;
}
printf("It contains %d digits.", digit);
return 0;
}
3-5.穷举法搬运砖块问题
这是中国古典算术问题,某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。有多少种搬法用N人正好搬N块砖?
输入格式:
输入正整数N。
输出格式:
输出所有满足条件的搬法,每种搬法占一行。
每行按如下格式依次输出该搬法中男人、女人、小孩的人数,按男人人数的递增顺序输出,中间用空格间隔(=前后没有多余的空格,行末也无空格)。
men=男人数 women=女人数 child=小孩数
若没有满足条件的搬法,则输出"No solution!"
输入样例1:
45
输出样例1:
men=0 women=15 child=30
men=3 women=10 child=32
men=6 women=5 child=34
men=9 women=0 child=36
输入样例2:
1
输出样例2:
No solution!
参考代码:
#include <stdio.h>
int main()
{
int n;
int flag = 0;
scanf("%d", &n);
for (int i = 0; i <= n / 3; i++) {
for (int j = 0; j <= n / 2; j++) {
for (int k = 0; k <= n; k++) {
if (3 * i + 2 * j + k == n) {
if (i + j + k * 2 == n) {
printf("men=%d women=%d child=%d\n", i, j, k * 2);
flag = 1;
}
}
}
}
}
if (flag == 0)
printf("No solution!");
return 0;
}
3-6.数字金字塔
输入一个正整数repeat (repeat<10),做repeat次下列运算:
输入一个正整数n(n<10),输出n行数字金字塔。
输出时使用以下语句:
printf(" ");
printf("%d ", i);
printf("\n");
输入格式:
输入在第1行中给出1个正整数repeat(repeat<10)
接下来repeat行,每行给出一个正整数n(n<10)
输出格式:
按照对应顺序的n值,依次输出repeat个数字金字塔
(n行数字金字塔的格式如样例所示,注意:每个数字后面跟一个空格。)
输入样例:
2
5
2
输出样例:
1
2 2 2
3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5
1
2 2 2
参考代码:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
for (int flag = 1; flag <= n; flag++) {
int m;
scanf("%d", &m);
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m * 2 - 2 * i; j++)
printf(" ");
for (int k = 1; k <= 2 * i - 1; k++)
printf("%d ", i);
printf("\n");
}
}
return 0;
}