一、斐波那契数列
#include <stdio.h>
int main() {
int n = 20; // 数列长度
int a = 0, b = 1; // 前两个数
printf("斐波那契数列前%d项:\n", n);
for (int i = 0; i < n; i++) {
if (i == 0) {
printf("%d\n", a); // 第1项
}
else if (i == 1) {
printf("%d\n", b); // 第2项
}
else {
int next = a + b; // 计算下一项
printf("%d\n", next);
a = b; // 更新前两个数
b = next;
}
}
return 0;
}
二、字符与 ASCII 码转换器
C语言中字符型数据的实质是整型数据,它是1个字节的整数,取值范围是-128到+127。 字符型数据在内存中实质上存储的是它的ASCII码,字符型数据和整型数据可以混合运算。
输入示例
A 97
输出样例:
65,97
A,a
B,b
输入样例:
# 42
输出样例:
35,42
#,*
$,+
解决代码:
#include <stdio.h>
int main() {
char A;
int N;
// 读取输入的字符和整数
scanf("%c %d", &A, &N);
// 第一行输出:字符A的ASCII码值和整数N的值,用逗号分隔
printf("%d,%d\n", (int)A, N);
// 第二行输出:字符A和ASCII码为N的字符
printf("%c,%c\n", A, (char)N);
// 第三行输出:字符A后相邻的字符,再输出ASCII码为N+1的字符
printf("%c,%c\n", A + 1, (char)(N + 1));
return 0;
}
三、逆序后四位
程序每次读入一个至少4位数的正整数,然后输出其后4位按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入57000,输出应该是7。
输入样例1:
34500
输出样例1:
54
输入样例2:
34567
输出样例2:
7654
解决代码:
#include <stdio.h>
#include <math.h>
int get_last_n_digits(int num, int n) {
if (n <= 0) return 0;
int divisor = (int)pow(10, n);
return abs(num) % divisor;
}
int reverse_digits(int num) {
int reversed = 0;
while (num > 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return reversed;
}
int main() {
int num = 34500;
int last_four = get_last_n_digits(num, 4);
int reversed = reverse_digits(last_four);
printf("最后4位反转后是: %d\n", reversed);
return 0;
}
四、苹果和虫子
你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果?
- 输入仅一行,包括n,x和y(均为整数)。输入数据保证y <= n * x。
输入样例:
10 4 9
输出样例:
7
代码:
#include <stdio.h>
int main() {
int n, x, y;
scanf("%d %d %d", &n, &x, &y);
int eaten = (y + x - 1) / x;
int remaining = n - eaten;
if (remaining < 0) remaining = 0;
printf("%d\n", remaining);
return 0;
}
五、判断闰年
#include <stdio.h>
int main() {
int year;
printf("请输入一个年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
printf("%d 是闰年\n", year);
} else {
printf("%d 不是闰年\n", year);
}
return 0;
}
六、判定日期合法性
输入2100年某一天的月和日的值,输出这一天是否为合法日期
输入样例1:
5 31
输出样例1:
YES
输入样例2:
2 29
输出样例2:
NO
解决代码:
#include <stdio.h>
int main() {
int month, day;
scanf("%d %d", &month, &day);
int is_valid =
(month == 1 && day >= 1 && day <= 31) ||
(month == 2 && day >= 1 && day <= 28) ||
(month == 3 && day >= 1 && day <= 31) ||
(month == 4 && day >= 1 && day <= 30) ||
(month == 5 && day >= 1 && day <= 31) ||
(month == 6 && day >= 1 && day <= 30) ||
(month == 7 && day >= 1 && day <= 31) ||
(month == 8 && day >= 1 && day <= 31) ||
(month == 9 && day >= 1 && day <= 30) ||
(month == 10 && day >= 1 && day <= 31) ||
(month == 11 && day >= 1 && day <= 30) ||
(month == 12 && day >= 1 && day <= 31);
printf("%s\n", is_valid ? "YES" : "NO");
return 0;
}
扩展一:同时输入年月日再次判断
要判断输入的年、月、日是否合法,需要考虑以下几点:
- 年份是否在有效范围内(如非负整数)
- 月份是否在 1-12 之间
- 日期是否在当月有效范围内(需考虑闰年 2 月为 29 天)
#include <stdio.h>
int main() {
int year, month, day;
scanf("%d %d %d", &year, &month, &day);
// 判断是否为闰年
int is_leap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
// 每月天数表,2月根据闰年动态调整
int days_in_month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 调整闰年2月的天数
if (is_leap) {
days_in_month[2] = 29;
}
int is_valid =
year >= 0 && // 年份合法性(假设非负)
month >= 1 && month <= 12 && // 月份范围
day >= 1 && day <= days_in_month[month]; // 日期范围
printf("%s\n", is_valid ? "YES" : "NO");
return 0;
}
七、获取输入数字的每一位
#include <stdio.h>
int main() {
unsigned long long num; // 使用无符号类型处理更大的正整数
scanf("%llu", &num);
while (num > 0)
{
printf("%d ", num % 10);
num /= 10;
}
return 0;
}
扩展一、如果想要从高位到低位,如159输出 1 5 9
#include <stdio.h>
int main() {
unsigned long long num;
scanf("%llu", &num);
// 计算位数
unsigned long long temp = num;
unsigned long long divisor = 1;
while (temp >= 10) {
temp /= 10;
divisor *= 10;
}
// 从高位到低位输出
while (divisor > 0) {
printf("%d ", (int)(num / divisor));
num %= divisor;
divisor /= 10;
}
return 0;
}
八、小明在哪里
小明同学是好学生。他每天严格按作息时间过着“宿舍-食堂-教室”三点一线的生活。他早6点前晚6点后在宿舍学习,早上6点至7点、中午12点至1点、下午5点至6点在食堂吃饭,其余时间在教室上课。
你知道小明现在在哪里吗?(不许用if语句和switch语句)
输入格式:
一行中给出当天的一个时间点,形如:HH:MM:SS,HH表示小时,MM表示分,SS表示秒,全天时间采用24小时制表示。
输出格式:
根据不同情况,输出一行文本,确定在宿舍输出:dormitory;确定在食堂输出:canteen;确定在教室输出:classroom;两段时间交接处不确定在哪里时输出:on the way。
输入样例1:
20:10:20
输出样例1:
dormitory
输入样例2:
06:00:00
输出样例2:
on the way
输入样例3:
08:00:00
输出样例3:
classroom
输入样例4:
17:30:00
输出样例4:
canteen
解决代码
#include <stdio.h>
#include <string.h>
int main() {
char time_str[9]; // "HH:MM:SS\0"
fgets(time_str, sizeof(time_str), stdin);
time_str[strcspn(time_str, "\n")] = 0; // 移除换行符
int h, m, s;
sscanf(time_str, "%d:%d:%d", &h, &m, &s);
int total_seconds = h * 3600 + m * 60 + s;
int t_6am = 6 * 3600;
int t_7am = 7 * 3600;
int t_12pm = 12 * 3600;
int t_1pm = 13 * 3600;
int t_5pm = 17 * 3600;
int t_6pm = 18 * 3600;
// 判断是否在宿舍 (6点前和6点后)
int is_dormitory = (total_seconds < t_6am) || (total_seconds >= t_6pm);
// 判断是否在食堂 (6-7点, 12-1点, 5-6点)
int is_canteen_1 = (total_seconds >= t_6am) && (total_seconds < t_7am);
int is_canteen_2 = (total_seconds >= t_12pm) && (total_seconds < t_1pm);
int is_canteen_3 = (total_seconds >= t_5pm) && (total_seconds < t_6pm);
int is_canteen = is_canteen_1 || is_canteen_2 || is_canteen_3;
// 判断是否在交接点 (6点, 7点, 12点, 1点, 5点, 6点)
int is_transition = (total_seconds == t_6am) || (total_seconds == t_7am) ||
(total_seconds == t_12pm) || (total_seconds == t_1pm) ||
(total_seconds == t_5pm) || (total_seconds == t_6pm);
// 使用简化的、互斥的索引计算
int index = 3 * is_transition +
1 * (!is_transition && is_canteen) +
0 * (!is_transition && !is_canteen && is_dormitory) +
2 * (!is_transition && !is_canteen && !is_dormitory);
// 输出结果
const char *locations[] = {"dormitory", "canteen", "classroom", "on the way"};
printf("%s\n", locations[index]);
return 0;
}
九、算法符号
形如A+B的算式,A和B为整数,中间是+、-、*、/ 符号之一。算式中间没有空格,所有输入数据中的除数都不为0。输出是一个整数
输入样例:
1+2
输出样例:
3
输入样例:
1-2
输出样例:
-1
解决代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b;
char c;
scanf("%d%c%d",&a,&c,&b);
switch(c)
{
case'+':printf("%d",a+b);break;
case'-':printf("%d",a-b);break;
case'*':printf("%d",a*b);break;
case'/':printf("%d",a/b);break;
}
return 0;
}
十、求方差
请编程输入4个实数,并输出它们的方差,结果保留4位小数。请注意格式说明符%lf的使用。(提示:方差是各个数据与平均数之差的平方的平均数)。
输入样例:
1 2 3 4
输出样例:
1.2500
解决代码:
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,d;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
double avg = (a+b+c+d) / 4;
double diff1 = pow(a - avg, 2);
double diff2 = pow(b - avg, 2);
double diff3 = pow(c - avg, 2);
double diff4 = pow(d - avg, 2);
// 计算方差
double variance = (diff1 + diff2 + diff3 + diff4) / 4;
// 按照要求保留4位小数输出方差
printf("%.4lf\n", variance);
return 0;
}
十一、日期格式
文档中填写日期时不同的人有不同的书写习惯,很多人习惯用小数点或其它字符作为分隔符,例如“2002.01.07”、“2002/1/7”、“02:01:7”都表示2002年1月7日。赵中瑞同学患有强烈的日期格式强迫症,当他看到一个日期时,一定会改写成形如“2002-01-07”的形式。
输入在一行中按照“yyyy.mm.dd”或“yy.mm.dd”的格式给出年、月、日。题目保证给出的日期是1900年元旦至今的合法的日期。
其中年可能为4位或2位,当年为2位数字时,默认为20世纪。例如:“76/2/23”表示“1976年2月23日”。
其中月份和日期可能为2位或1位数字。
输出格式:
在一行中按照“yyyy-mm-dd”的格式输出日期,其中年份为4位,月份和日期为2位,不够2位时用0补齐。
输入样例1:
2002.1.7
输出样例1:
2002-01-07
输入样例2:
97/07/1
输出样例2:
1997-07-01
解决代码:
#include <stdio.h>
int main() {
int year,month,day;
char pat1,pat2;
scanf("%d%c%d%c%d",&year,&pat1,&month,&pat2,&day);
if (year < 100) year += 1900;
printf("%04d-%02d-%02d",year,month,day);
return 0;
}
十二、乘法格式
输入格式:
在一行中给出被污染的算式:XAXB*CXDX。其中A、B、C、D、X代表1位数字。
输入样例:
1234*5678
输出样例:
24*57=1368
解决代码:
#include <stdio.h>
int main() {
int a,b,c,d,x;
scanf("%1d%1d%1d%1d*%1d%1d%1d%1d",&x,&a,&x,&b,&c,&x,&d,&x);
a = a * 10;
c = c * 10;
int left,right,result;
left = a + b;
right = c + d;
result = left * right;
printf("%d*%d=%d",left,right,result);
return 0;
}
十三、计算邮费
根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在1000克以内(包括1000克), 基本费8元。超过1000克的部分,每500克加收超重费4元,不足500克部分按500克计算;如果用户选择加急,多收5元。
如果字符是y,说明选择加急;如果字符是n,说明不加急。
输入样例:
1200 y
输出样例:
17
解决代码:
#include <stdio.h>
int main() {
int weight;
char urgent;
int total_fee = 0;
int urgent_fee = 0;
// 读取输入
scanf("%d %c", &weight, &urgent);
// 计算加急费用
if (urgent == 'y') {
urgent_fee = 5;
}
// 计算总费用
if (weight <= 1000) {
total_fee = 8 + urgent_fee;
} else {
int extra_weight = weight - 1000; // 超出的重量
int extra_fee = 0;
// 逐步累加超出部分的费用(每500克4元)
while (extra_weight > 0) {
extra_fee += 4;
extra_weight -= 500; // 减去已计费的500克
}
total_fee = 8 + extra_fee + urgent_fee;
}
// 输出结果
printf("%d\n", total_fee);
return 0;
}
十四、两位数计算题(三元表达式)
读入一道形如A+B=C的四则运算题,正确则输出"GOOD!",错误输出"SORRY!"。
其中两个运算数为1到100范围以内的随机整数,运算符为加减乘除四种运算之一。
输入样例:
56+23=79
输出样例:
GOOD!
输入样例:
45/21=3
输出样例:
SORRY!
解决代码:
#include <stdio.h>
int main() {
int a,b,c;
char flag;
char speculate = 0 ;
scanf("%d%c%d=%d",&a,&flag,&b,&c);
if (flag == '+') {
speculate = (a+b==c) ? 1 :0;
}
if (flag == '-') speculate = (a-b==c) ? 1 :0;
if (flag == '*') speculate = (a*b==c) ? 1 :0;
if (flag == '/') speculate = (a/b==c) ? 1 :0;
printf("%s",speculate == 0 ? "GOOD!" : "SORRY!");
}
评论区