目 录CONTENT

文章目录
C

C-基础-100练(一)

~梓
2025-05-29 / 0 评论 / 0 点赞 / 9 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一、斐波那契数列

#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. 年份是否在有效范围内(如非负整数)
  2. 月份是否在 1-12 之间
  3. 日期是否在当月有效范围内(需考虑闰年 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!");

}
0

评论区