一. 程序题(共15题,100分)
1. (程序题)
题目编号:Exp02-Basic01,GJBook3-03-03
题目名称:递增排序
题目描述:任意三个实数a、b、c,按照从小到大的顺序输出。
输入:输入三个实数(测试数据均只有一位小数)。
输出:按照从小到大顺序输出之前输入的三个实数,以一个西文空格间隔,且每个实数小数点后保留1位。
样例:
输入: 2.3 5.6 1.2
输出: 1.2 2.3 5.6
#include<stdio.h>
int main() {
float a, b, c;
scanf("%f %f %f", &a, &b, &c);
if (a >=b && b >= c) printf("%.1f %.1f %.1f", c, b, a);
else if (a >= c && c >= b) printf("%.1f %.1f %.1f", b, c, a);
else if (b >= a && a >= c) printf("%.1f %.1f %.1f", c, a, b);
else if (b >= c && c >= a) printf("%.1f %.1f %.1f", a, c, b);
else if (c >= b && b >= a) printf("%.1f %.1f %.1f", a, b, c);
else if (c >= a && a >= b) printf("%.1f %.1f %.1f", b, a, c);
}
2. (程序题)
题目编号:Exp02-Basic02
题目名称:括号统计
题目描述:编程序,判断给定以字符‘@’结束的字符序列中‘(’与‘)’、‘[’与‘]’、‘{’与‘}’的个数是否相等。
输入:输入一串以字符‘@’结束的字符序列,其间可能含有若干空白字符。
输出:个数不相等的括号(按花括号、方括号、圆括号的顺序);如果三种括号的个数都相等,输出NULL。
样例1:
输入:{a+b*c+(d/e-f]}}@
输出:{}[]()
样例2:
输入:{a + b*c+(d/e-f]}@
输出:[]()
#include<stdio.h>
int main() {
char z;
int a, b, c, d, e, f;
a = b = c = d = e = f = 0;
do {
z=getchar();
if (z == '@')break;
if (z == '(')a++;
if (z == ')')b++;
if (z == '[')c++;
if (z == ']')d++;
if (z == '{')e++;
if (z == '}')f++;
} while (-1);
if (e != f)printf("{}");
if (c != d)printf("[]");
if (a != b)printf("()");
if (a == b && c == d && e == f)printf("NULL");
}
3. (程序题)
题目编号 :Exp02-Basic03
题目名称:数字求和
题目描述:给定一个整数a,以及另外的5个整数,问题是:这5个整数中,可以被a整除的整数和是多少?
输入:输入一行只包括6个小于100的整数,其中第一个整数是a,输入保证a不为零。
输出:输出一行,给出一个整数,是5个数中可以被a整除的所有整数的和。
样例1:
输入:10 10 -20 30 40 11
输出:60
样例2:
输入:11 10 20 30 40 12
输出:0
#include<stdio.h>
int main() {
int a, b, c, d, e, f;
int m = 0;
scanf("%d%d%d%d%d%d" ,&a, &b, &c, &d, &e, &f);
if (b % a == 0)m += b;
if (c % a == 0)m += c;
if (d % a == 0)m += d;
if (e % a == 0)m += e;
if (f % a == 0)m += f;
printf("%d", m);
}
4. (程序题)
题目编号 :Exp02-Basic04
题目名称:养老金
题目描述:某一国家养老金发放的原则是:
(1)男人(假设用数字1表示)超过65岁每周给50元钱,如果超过70岁每周再加20元钱。
(2)女人(假设用数字2表示)超过60岁每周给45元钱,如果超过65岁每周再加25元钱。
编程序,读入一个人的性别和年龄,输出他每周可领养老金数额。如果一个人还没到拿取养老金的年龄,那么就输出一个适合的信息。
输入:输入一行包括2个整数,分别对应性别和年龄,输入保证性别年龄输入都为合理整数。
输出:如果达到领取养老金年龄,就请输出每周应得养老金数额;否则输出NULL。
样例1:
输入: 1 75
输出: 70
样例2:
输入: 2 63
输出: 45
#include<stdio.h>
int main() {
int a, b, w;
scanf("%d%d", &a, &b);
if (a == 1) {
if (b <= 65) printf("NULL");
else if (b > 70)printf("70");
else printf("50");
}
if (a == 2) {
if (b <= 60)printf("NULL");
else if (b > 65)printf("70");
else printf("45");
}
}
5. (程序题)
题目编号:Exp02-Basic05
题目名称:嵌套函数
题目描述:编写程序,当x=1.0、2.0、…、20.0时,计算如下函数到5层嵌套。F(x)=1+1/(1+1/(1+1/(1+1/(1+1/x))))
输入:一个浮点数表示x的值,输入保证x不为零。
输出:一个浮点数F(x)的值,保留小数点后3位。
样例:
1
1.625
#include<stdio.h>
int main() {
float x, y;
scanf("%f", &x);
y = 1 + 1.0 / (1 + 1.0 / (1 + 1.0 / (1 + 1.0 / (1 + 1.0 / x))));
printf("%.3f", y);
}
6. (程序题)
题目编号 :Exp02-Basic06,GJBook3-04-09
题目名称:符合条件自然数
题目描述:编写程序,打印所有小于正整数data且可被11整除的自然数。
输入:从键盘输入一个正整数data
输出:输出所有小于data且可被11整除的自然数,数与数之间以一个空格做间隔,最后一个数后无多余字符。
样例1:
输入:50
输出:0 11 22 33 44
样例2:
输入:80
输出:0 11 22 33 44 55 66 77
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i += 11) {
printf("%d ", i);
}
}
7. (程序题)
题目编号:Exp02-Basic07,GJBook3-03-07
题目名称:倍数
题目描述:任意一个整数n,如果n能同时被3、5、7整除,则n是3、5、7的倍数,如果n只能同时被其中的两个数整除,则n是两个数的倍数,如果n只能被其中一个数整除,则n是一个数的倍数,否则n不是3、5、7的倍数。
输入:输入一个整数。
输出:按照是否是倍数输出。
样例1:
输入:105
输出:3,5,7
样例2:
输入:30
输出:3,5
样例3:
输入:21
输出:3,7
样例4:
输入:35
输出:5,7
样例5:
输入:14
输出:7
样例6:
输入:101
输出:NULL
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n % 3 == 0)printf("3,");
if (n % 5 == 0 && n % 7 == 0)printf("5,7");
if (n % 5 == 0 && n % 7 != 0)printf("5");
if (n % 3 != 0 && n % 5 != 0 && n % 7 != 0)printf("NULL");
}
8. (程序题)
题目编号 :Exp02-Basic08,GJBook3-04-12
题目名称:三位Armstrong数
题目描述:编写程序,打印所有3位的Armstrong数,Armstrong数是指其值等于它本身每位数字立方和的数,如153就是一个Armstrong数。153=
输入:无
输出:打印所有3位的Armstrong数,每个Armstrong数间用一个西文空格间隔,最后一个数后无多余字符。
样例:无。详见输入输出说明
#include<stdio.h>
int main() {
int g, s, b;
for (int i = 100; i <= 999; i++) {
g = i % 10;
s = (i % 100) / 10;
b = i / 100;
if (g * g * g + s * s * s + b * b * b == i) { printf("%d ", i); }
}
}
9. (程序题)
题目编号 :Exp02-Basic09,GJBook3例-04-10
题目名称:斐波纳契序列
问题描述:
开始,有一对小兔子。
一个月后,变成大兔子开始怀孕;
两个月后, 生出一对小兔子,这时共有两对兔子(一对大兔子, 一对小兔子), 同时大兔子又再次怀孕;
三个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又生出一对小兔子, 这时共有三对兔子(两对大兔子, 一对小兔子), 所有大兔子又全部怀孕;
四个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子, 这时共有五对兔子(三对大兔子, 两对小兔子), 所有大兔子又全部怀孕;
五个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子, 这时共有八对兔子(五对大兔子, 三对小兔子), 所有大兔子又全部怀孕;
…… ……
假设在兔子的生养过程中没有死亡。编程序,输入 n , 计算 n 个月后,有多少对兔子, 并输出。
提示:注意序列各项间的递推关系。
输入:一个非负整数n,表示月份(n≤91)
输出:n 个月后的兔子数(单位:对)
样例1:输入 0 输出 1
样例2:输入 1 输出 1
样例3:输入 2 输出2
样例4:输入10 输出89
int main() {
long long a[92];
a[0] = 1;
a[1] = 1;
for (int i = 2; i <= 91; i++) { a[i] = a[i - 1] + a[i - 2]; }
int n;
scanf("%d", &n);
printf("%lld", a[n]);
}
10. (程序题)
题目编号:Exp02-Basic10,GJBook3-04-15
题目名称:爱因斯坦阶梯
问题描述:设有阶梯,不知其数,但知:每步跨2阶,最后剩1阶;每步跨3阶,最后剩2阶;每步跨5阶,最后剩4阶;每步跨7阶,正好到楼顶。编程序求最少共有多少阶。
输入:无
输出:台阶数目
样例:无。详见输入输出说明。
#include<stdio.h>
int main() {
int i = 1;
while (1) {
if (i % 2 == 1 && i % 3 == 2 && i % 5 == 4 && i % 7 == 0) {
printf("%d", i);
break;
}
i++;
}
}
11. (程序题)
题目编号 :Exp02-Basic11,GJBook3-04-03
题目名称:勒让德多项式
题目描述:
编一个程序,输入x、n,计算勒让德(Legendre)多项式的第 n 项(此题假定n取0时,为勒让德多项式第0项)。
输入:一个浮点数和一个整数,分别对应x和n(0<=n<=20)。
输出:一个浮点数,即勒让德多项式第n项的值,注意小数点后保留到第2位。
样例1:
输入:3.4 2
输出:16.84
样例2:
输入:3.4 10
输出:30143685.82
样例3:
输入:-3.4 2
输出:16.84
# include<stdio.h>
double Pn(double x, int n);
int main()
{
double x;
double result;
int n;
scanf("%lf%d", &x, &n);
result = Pn(x, n);
printf("%.2lf", result);
return 0;
}
double Pn(double x, int n)
{
double res;
if (n == 0)
return 1.0;
else if (n == 1)
return x;
else if (n > 1)
{
res = ((2 * n - 1) * x * Pn(x, n - 1) / n - (n - 1) * Pn(x, n - 2) / n);
return res;
}
}
12. (程序题)
题目编号 :Exp02-Basic12,GJBook3-04-13
题目名称:数字金字塔
题目描述:编程序,制打印如下所示的n行数字金字塔(n由用户从键盘输入)。
输入:一个正整数 n (≤10)
输出:如上所示的类似数字金字塔。输出由数字 0~9构成的n行数字三角矩阵:其中第一行有1个数,第二行有3个数,依次类推,每个数字占用2位英文字符宽度,宽度不足2位的的在数字左侧补空格;整个数字三角阵,除必要的空格、数字、回车换行符,无多余字符。
样例1:
输入:1
输出:
(注:1的前面有一个空格)
样例2:
输入:3
输出:
(注:末行的第一个数字1前面有一个空格)
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int s = 1; s <= 2 * (n - i); s++) { printf(" "); }
for (int m = 1; m <= i; m++) { printf(" %d", m % 10); }
for (int h = i - 1; h >= 1; h--) { printf(" %d", h); }
printf("\n");
}
}
13. (程序题)
题目编号 :Exp02-Enhance01,GJBook3-04-02
题目名称:计算 e^x
题目描述:请计算上述序列的前101项的和(截止到n取100)
输入:一个浮点数,对应x值。
输出:一个浮点数,即e^x的近似值,小数点后保留到第2位。
注:本题不允许使用math.h头文件和相关的pow和exp等函数。
样例1:
输入:0
输出:1.00
样例2:
输入:4.3
输出:73.70
#include<stdio.h>
int main() {
float x;
double sum = 1.0, num = 1.00;
scanf("%f", &x);
for (int i = 1; i < 99; i++) {
num = num * x / i;
sum = sum + num;}
printf("%.2lf", sum);
}
14. (程序题)
题目编号:Exp02-Enhance03
题目名称:公式累加
题目描述:用如下的展开式计算当n为某给定值时,sh(x)的值。
编写程序,对上面的公式读入x,输出序列的和直到尾项的绝对值 小于10^-5。
输入:一个浮点数作为x的值。
输出:一个浮点数,保留小数点后6位。
样例1:
输入:1
输出:1.175198
样例2:
输入:1.5
输出:2.129277
#include<stdio.h>
#include<math.h>
double pro(double x, double n);
int main() {
double a = 0, b, x;
scanf("%lf", &x);
b = x;
for (int i = 1; fabs(b) >= 1e-5; i++) {
a += b;
b = pro(x, i);
}
printf("%.6lf", a);
}
double pro(double x, double n) {
double sum = 1;
for (int i = 1; i <= 2 * n + 1; i++) {
sum *= x / i;
}
return sum;
}
15. (程序题)
题目编号:Exp02-Enhance04,GJBook3-04-14
题目名称:字母矩阵
题目描述:用循环语句控制打印如下图形,其中输出的每个字母占用2个字符宽度(空格在前,字母在后)。
输入:无
输出:如上图字母矩阵
说明:请同学们根据字母、位置的规律实现该程序。打表爽一时,考试两行泪~
#include<stdio.h>
int main() {
char a[] = { 'A','B','C','D','E','F','G','H','I' };
for (int i = 0; i <= 5; i++) {
for (int s = i; s <= i + 8; s++) {
printf(" %c", a[s % 9]);
}
printf("\n");
}
for (int m = 4; m >= 0; m--) {
for (int p = m; p <= m + 8; p++) {
printf(" %c", a[p % 9]);
}
printf("\n");
}
}