C 语言题解集
1. 海军节礼炮问题(Q234)
题目描述:
在海军节开幕式上,有 A、B、C 三艘军舰要同时开始鸣放礼炮各 21 响。已知 A 舰每隔 5 秒放 1 次,B 舰每隔 6 秒放 1 次,C 舰每隔 7 秒放 1 次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。
输出格式要求: n = %d\\n
解法一:正向计数法
#include <stdio.h>
int main()
{
int count = 0, now = 0;
// 遍历所有时间点,统计能听到礼炮的次数
while(now <= 7 * 20){ // 最长时间为 C 舰放完 21 响的时间
// 如果当前时间是 A、B、C 任一舰的放炮时间,则计数加 1
if((now % 5 == 0 && now <= 5 * 20) || (now % 6 == 0 && now <= 6 * 20) || (now % 7 == 0)){
count++;
}
now++;
}
printf("n = %d\\n", count);
return 0;
}
解法二:减去重复法
#include <stdio.h>
int main(){
int a = 0, b = 0, c = 0, count = 21 * 3; // 初始总数为 3 艘舰×21 响
while(c <= 7 * 20){
if(a % 6 == 0 && a % 7 == 0){ // A 与 B、C 同时鸣放,需减去 2 次重复
count -= 2;
} else if(a % 6 == 0 || a % 7 == 0){ // A 与 B 或 A 与 C 同时鸣放
count—;
if(b % 7 == 0){ // B 与 C 也同时鸣放
count—;
}
}
a += 5; // A 舰下次鸣放时间
b += 6; // B 舰下次鸣放时间
c += 7; // C 舰下次鸣放时间
}
printf("n = %d\\n", count);
return 0;
}
2. 星期显示程序(Q2421)
题目描述:
编写程序实现以下功能。从键盘输入一个整数,若输入数字 0,则屏幕显示:“Sunday”;若输入数字 1,则屏幕显示:“Monday”;若输入数字 2,则屏幕显示:“Tuesday”;若输入数字 3,则屏幕显示:“Wednesday”;若输入数字 4,则屏幕显示:“Thursday”;若输入数字 5,这屏幕显示:“Friday”;若输入数字 6,则屏幕显示:“Saturday”;若输入其它数字,则屏目原样输出该数字。
输入提示信息: Input a single numeral:
输入数据格式: %d
输出数据格式:
- 若输入数字 0,则屏幕输出:Sunday\\n
- 若输入数字 1,则屏幕输出:Monday\\n
- 若输入数字 2,则屏幕输出:Tuesday\\n
- 若输入数字 3,则屏幕输出:Wednesday\\n
- 若输入数字 4,则屏幕输出:Thursday\\n
- 若输入数字 5,则屏幕输出:Friday\\n
- 若输入数字 6,则屏幕输出:Saturday\\n
#include <stdio.h>
int main()
{
int n;
// 使用字符串数组存储星期名称
char* weekday[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
printf("Input a single numeral:");
scanf("%d", &n);
// 如果输入在 0-6 范围内,输出对应星期;否则原样输出数字
if(n < 7 && n > –1){
puts(weekday[n]);
} else {
printf("%d\\n", n);
}
return 0;
}
3. 快递费用计算(Q3124)
题目描述:
上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成 5 个区域:快递费按邮件重量计算,由起重费用、续重费用两部分构成:
(1)起重(首重)1 公斤按起重资费计算(不足 1 公斤,按 1 公斤计算),超过首重的重量,按公斤(不足 1 公斤,按 1 公斤计算)收取续重费;
(2)同城起重资费 10 元,续重 3 元/公斤;
(3)寄往 1 区(江浙两省)的邮件,起重资费 10 元,续重 4 元;
(4)寄往其他地区的邮件,起重资费统一为 15 元。而续重部分,不同区域价格不同:2 区的续重 5 元/公斤,3 区的续重 6.5 元/公斤,4 区的续重 10 元/公斤。
编写程序,从键盘输入邮件的目的区域编码和重量,计算并输出运费,计算结果保留 2 位小数。提示:续重部分不足一公斤,按 1 公斤计算。因此,如包裹重量 2.3 公斤:1 公斤算起重,剩余的 1.3 公斤算续重,不足 1 公斤按 1 公斤计算,1.3 公斤折合续重为 2 公斤。重量应大于 0、区域编号不能超出 0-4 的范围。
程序运行结果示例 1:
4,4.5↙
Price: 55.00
程序运行结果示例 2:
5,3.2↙
Error in Area
输入格式: 用逗号分隔的两个数字,第一个表示区域、第二个是重量:%d,%f
输出格式:
- 价格的输出格式:Price: %5.2f\\n
- 区域错误的提示信息:Error in Area\\n
#include <stdio.h>
#include <math.h>
int main()
{
int area; // 区域编号
float weight, price; // 重量和价格
scanf("%d,%f", &area, &weight);
// 计算续重重量(向上取整)
weight = ceil(weight – 1);
// 检查区域编号是否合法
if(area < 0 || area > 4){
printf("Error in Area\\n");
return 0;
} else if(area == 0){ // 同城
price = 10 + weight * 3;
} else if(area == 1){ // 1 区(江浙两省)
price = 10 + weight * 4;
} else { // 2、3、4 区
price = 15; // 起重资费
switch(area){
case 2:
price += weight * 5;
break;
case 3:
price += weight * 6.5;
break;
case 4:
price += weight * 10;
break;
}
}
printf("Price: %5.2f\\n", price);
return 0;
}
4. 三角形判断(Q1723)
题目描述:
编程输入三角形的三条边 a、b、c,判断它们能否构成三角形。若能构成三角形,指出是何种三角形:等腰三角形(等边三角形时只输出等腰三角形)、直角三角形,等腰直角三角形,还是一般三角形?(假设 1e-1 表示足够小的数)
注意事项:
(1)不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程。
(2)所有变量在第一条可执行语句前定义。
(3)输入输出格式要和以下给定格式完全一致,建议拷贝粘贴到程序中。
(4)如果定义常量,请使用宏常量,不要使用 const。
输入提示信息: Input a,b,c:
输入格式: %f,%f,%f
运行示例:
Input a,b,c:3,4,5↙
直角三角形
#include <stdio.h>
#include <math.h>
int main()
{
float a, b, c;
printf("Input a,b,c:");
scanf("%f,%f,%f", &a, &b, &c);
// 首先判断是否能构成三角形(任意两边之和大于第三边)
if(a + b > c && b + c > a && a + c > b && a > 0 && b > 0 && c > 0){
// 判断是否为直角三角形(勾股定理)
if(fabs(a * a + b * b – c * c) <= 1e-1 ||
fabs(b * b + c * c – a * a) <= 1e-1 ||
fabs(a * a + c * c – b * b) <= 1e-1){
// 既是直角又是等腰
if(a == b || b == c || c == a){
printf("等腰直角三角形");
} else {
printf("直角三角形");
}
} else if(a == b || a == c || b == c){ // 等腰三角形
printf("等腰三角形");
} else { // 一般三角形
printf("一般三角形");
}
} else {
printf("不是三角形");
}
return 0;
}
5. 求不超过 1000 的回文素数(Q432)
题目描述:
求不超过 1000 的回文素数。
输入格式要求: 提示信息:Following are palindrome primes not greater than 1000:\\n
输出格式要求: %d\\t
程序运行示例:
Following are palindrome primes not greater than 1000:
11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
#include <stdio.h>
#include <math.h>
// 判断素数的函数声明
int prime(int n);
int main()
{
int n = 11; // 从 11 开始查找回文素数
printf("Following are palindrome primes not greater than 1000:\\n");
while(n < 1000){
int wei = 10;
// 计算数字的位数,找到最高位的权值
while(n / wei >= 10) wei *= 10;
// 判断是否为回文数且为素数(只需比较首位和末位)
if(n / wei == n % 10 && prime(n)){
printf("%d\\t", n);
}
n++;
}
return 0;
}
// 判断素数的函数
int prime(int n){
if(n < 2) return 0; // 小于 2 不是素数
if(n == 2 || n == 3) return 1; // 2 和 3 是素数
if(n % 2 == 0 || n % 3 == 0) return 0; // 能被 2 或 3 整除的不是素数
// 只需判断到 sqrt(n),且只需判断 6k±1 形式的因子
for(int i = 5; i <= sqrt(n); i += 6){
if(n % i == 0 || n % (i + 2) == 0) return 0;
}
return 1;
}





