C语言练习题

目一 :输出一段单词中最后一个单词的长度

描述

对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。

输入描述:

在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。

除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过 10^3 。

输出描述:

在一行上输出一个整数,代表最后一个单词的长度。

思路

  1. 使用 fgets() 读取整行输入,包括空格
  2. 从字符串末尾开始向前遍历
  3. 跳过末尾可能存在的换行符和空格
  4. 找到最后一个单词的起始位置
  5. 统计最后一个单词的长度,直到遇到空格或字符串结束
  6. 输出结果
c 复制代码
#include<stdio.h>
#include<string.h>

int main()
{
    char sentence[1001];
    fgets(sentence,sizeof(sentence),stdin);//获取字符串
    int len = strlen(sentence);//得到字符串长度
    int count = 0;

    //跳过末尾的换行符
    if(len >0 && sentence[len - 1] == '\n')
    {
        sentence[len -1] = '\0';
        len--;
    }
    //从后往前便利数组,找到空格处,为最后一个单词,并进行计数
    for(int i = len - 1;i >=0;i--)
    {
        if(sentence [i] != ' ')//不为空格进行计数
        {
            count++;
        }
        else
        {
            break;//调出循环
        }
    }

    printf("%d \n",count);
    return 0;
}

题目二

描述

对于给定的由大小写字母、数字和空格混合构成的字符串 s,给定字符 c,按要求统计:

若 c 为大写或者小写字母,统计其大小写形态出现的次数和;

若 c 为数字,统计其出现的次数。

保证字符 c 要么为字母、要么为数字。

输入描述:

第一行输入一个长度 1≦length(s)≦10^3,由大小写字母、数字和空格构成的字符串 s。保证首尾不为空格。

第二行输入一个字符 c,保证 c 为大小写字母或数字。

输出描述:

在一行上输出一个整数,代表统计结果。

思路

  1. 使用fgets读取一行字符串,包括空格,直到换行符。
  2. 使用scanf(" %c", &c)读取字符c,前面的空格可以跳过换行符。
  3. 计算字符串s的长度(不包括换行符,如果有的话,我们可以将换行符替换为'\0')。
  4. 初始化计数器count=0。
  5. 如果c是字母(isalpha©),则遍历字符串s,对于每个字符,如果它是字母,并且将其转换为小写后等于c的小写形式,则计数。
  6. 如果c是数字(isdigit©),则遍历字符串s,对于每个字符,如果等于c,则计数。

注意:我们使用<ctype.h>中的函数,如isalpha, isdigit, tolower等。

c 复制代码
#include<stdio.h>
#include<string.h>
#include<ctype.h>

int main()
{
    char s[1001];
    char c;

    fgets(s,sizeof(s),stdin);//获取字符串
    s[strcspn(s,"\n")] = '\0';//去掉末尾的换行符
    scanf(" %c",&c);//获取字符c,注意%s前的空格

    int count = 0;
    int len = strlen(s);

    //根据字符c来进行统计
    if(isalpha(c))
    {
        char upper_c = toupper(c);
        char lower_c = tolower(c);

        for(int i = 0;i < len;i++)
        {
            if(s[i] == upper_c || s[i] == lower_c)
            {
                count++;
            }
        }
    }
    else
    {
        //c是数字
        for(int i = 0;i < len;i++)
        {
            if(s[i] == c)
            {
                count++;
            }
        }
    }

    printf("%d \n",count);

    return 0;
}

题目三

描述

对于明明生成的 n 个 1 到 500 之间的随机整数,你需要帮助他完成以下任务:

删去重复的数字,即相同的数字只保留一个,把其余相同的数去掉;

然后再把这些数从小到大排序,按照排好的顺序输出。

你只需要输出最终的排序结果。

输入描述:

第一行输入一个整数 n(1≦n≦1000),代表明明生成的数字个数。

此后 n 行,第 i 行输入一个整数 a_i (1≦a_i≦500),代表明明生成的随机整数。

输出描述:

输出若干行,每行输出一个整数,代表输入数据排序后的结果。第一行输出最小的数字。

c 复制代码
#include<stdio.h>

int main()
{
    int n ;
    scanf("%d",&n);

    //创建一个标记数组,用于记录数字是否出现过
    int flag[501] = {0};
    int num ;//用于接收输入的数字

    //读取并标记
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&num);
        flag[num] = 1;//将接收的数据作为下标放到指定位置,并进行标记
    }
    //输出结果(从小到大)
    for(int i = 1;i <= 500;i++)
    {
        if(flag[i] == 1)
        {
            printf("%d\n",i);
        }
    }
    return 0;
}

题目四

描述

对于给定的由小写字母和数字混合构成的字符串 s,你需要按每 8 个字符换一行的方式书写它,具体地:

书写前 8 个字符,换行;

书写接下来的 8 个字符,换行;

......

重复上述过程,直到字符串被完全书写。

特别地,如果最后一行不满 8 个字符,则需要在字符串末尾补充 0,直到长度为 8。

输入描述:

在一行上输入一个长度 1≦length(s)≦100,由小写字母和数字构成的字符串 s。

输出描述:

输出若干行,每行输出 8 个字符,代表按题意书写的结果。

复制代码
#include <stdio.h>
#include<string.h>
int main()
{
    char s[101];

    //读取字符串
    scanf("%s",&s);
    int len = strlen(s);
    int index = 0;

    //按每8个字符一行输出
    while(index < len)
    {
        for(int i = 0;i < 8;i++)
        {
            if(index + i < len)
            {
                printf("%c",s[index+i]);
            }
            else
            {
                printf("0");
            }
        }
        printf("\n");
        index += 8;
    }


    return 0;
}

题目五

描述

对于给定的十六进制数,输出其对应的十进制表示。

在本题中,十六进制数的格式为:"0x" 开头,后跟若干个十六进制数字(保证为 "0-9" 和 "A-F" 中的一个)。其中,"A-F" 依次代表十进制中的 10∼15。

输入描述:

在一行上输入一个十六进制数 s,代表待转换的十六进制数,格式见题干。保证 s 转化得到的十进制数 x 的范围为 1≦x<2^31。

输出描述:

在一行上输出一个整数,代表 s 对应的十进制数。

复制代码
#include<stdio.h>
#include<string.h>
#include<ctype.h>

int main()
{
    char hex[20];


    scanf("%s",&hex);
    int len = strlen(hex);
    long long decimal = 0;//使用long long防止溢出

    //跳过"0x"前缀
    int start = 2;
    for(int i = start;i < len;i++)
    {
        char c = hex[i];
        int digit = 0;
        if(isdigit(c))
        {
            digit = c - '0';
        }
        else
        {
            //将字母转化为大写(处理小写字母的情况)
            c = toupper(c);
            digit = c - 'A' + 10;
        }
        decimal = decimal *16 + digit;
    }

    printf("%lld\n",decimal);

    return 0;
}

题目六

描述

对于给定的整数 n,从小到大依次输出它的全部质因子。即找到这样的质数 p_1,p_2,⋯" ",p_k,使得 n=p_1×p_2×⋯×p_k。

输入描述:

在一行上输入一个整数 n(2≦n≦2×10^9+14) 代表待分解的整数。

输出描述:

在一行上从小到大输出若干个整数,代表 n 的质因子。

复制代码
#include <stdio.h>

int main() {
    long long n;
    scanf("%lld", &n);
    
    long long original_n = n;
    int first = 1; // 用于控制输出格式
    
    // 处理因子2
    while (n % 2 == 0) {
        if (!first) {
            printf(" ");
        }
        printf("%d", 2);
        n /= 2;
        first = 0;
    }
    
    // 处理奇数因子
    for (long long i = 3; i * i <= n; i += 2) {
        while (n % i == 0) {
            if (!first) {
                printf(" ");
            }
            printf("%lld", i);
            n /= i;
            first = 0;
        }
    }
    
    // 处理剩余的质数
    if (n > 1) {
        if (!first) {
            printf(" ");
        }
        printf("%lld", n);
    }
    
    printf("\n");
    
    return 0;
}

题目七

描述

对于给定的正实数 x,输出其四舍五入后的整数。更具体地说,若 x 的小数部分大于等于 0.5,则输出向上取整后的整数;否则输出向下取整后的整数。

【提示】

不同编译器版本、不同系统环境对待实数的精度处理不同,我们建议您使用在线编译器进行调试。

输入描述:

输入一个小数点后位数不超过 5 位的实数 x(0<x≦20)。保证实数不存在前导零和后导零。

输出描述:

在一行上输出一个整数,代表 x 四舍五入后的结果。

复制代码
#include <stdio.h>

int main() {
    double x;
    scanf("%lf", &x);
    
    // 方法2:手动实现四舍五入
    int result;
    
    // 将小数部分乘以10,检查第一位小数
    double decimal_part = x - (int)x;
    
    if (decimal_part >= 0.5) {
        result = (int)x + 1;  // 向上取整
    } else {
        result = (int)x;      // 向下取整
    }
    
    printf("%d\n", result);
    
    return 0;
}

题目八

描述

数据表中,一条记录包含表索引和数值两个值。请对表索引相同的记录进行合并(即将相同索引的数值进行求和运算),随后按照索引值的大小从小到大依次输出。

输入描述:

第一行输入一个整数 n(1≦n≦500) 代表数据表的记录数。

此后 n 行,第 i 行输入两个整数 x_i,y_i (0≦x_i≦11" " 111" " 111;" " 1≦y_i≦10^5) 代表数据表的第 i 条记录的索引和数值。

输出描述:

一共若干行(视输入数据变化),第 i 行输出两个整数,代表合并后数据表中第 i 条记录的索引和数值。

复制代码
#include<stdio.h>
#include<stdlib.h>

#define MAX_INDEX 1111112

int main()
{
    int n;
    scanf("%d",&n);

    //使用数组存储每个索引的累计值
    long long *hash =(long long *) calloc(MAX_INDEX,sizeof(long long));

    //读取并累加记录
    for(int i = 0;i < n;i++)
    {
        int index;
        long long value;
        scanf("%d %lld",&index,&value);
        hash[index] += value;
    }

    //输出非零索引的记录
    for(int i = 0;i < MAX_INDEX;i++)
    {
        if(hash[i] != 0)
        {
            printf("%d %lld \n",i,hash[i]);
        }
    }

    free(hash);
    return 0;
}

题目九

描述

对于给定的正整数 n ,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。具体地,如果遇到相同数字,保留在最右侧出现的第一个数字。

输入描述:

在一行上输入一个整数 n(1≦n≦10^8) 代表给定的整数。保证 n 的最后一位不为 0 。

输出描述:

在一行上输出一个整数,代表处理后的数字。

复制代码
#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);

    int used[10] = {0};//初始化一个数组来跟踪数字0-9是否出现过

    while(n > 0)
    {
        int digit = n%10;//获取当前最低位数字
        if(!used[digit])//当前数字在数组中没有出现
        {
            used[digit] = 1;//标记一下,现在出现了
            printf("%d",digit);//输出该数组
        }
        n /= 10;//移除已处理的最低位
    }

    printf("\n");

    return 0;

}

题目十

描述

对于给定的字符串,统计其中的 ASCII 码在 0 到 127 范围内的不同字符的个数。

备注:受限于输入,本题实际输入字符集为 ASCII 码在 33 到 126 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。

输入描述:

输入一个长度 1≦length(s)≦500,仅由图片中的可见字符构成的字符串 s。

输出描述:

在一行上输出一个整数,代表给定字符串中 ASCII 码在 0 到 127 范围内的不同字符的个数。

逻辑

复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char s[510];
    int used[128] = {0};
    int count = 0;
    
    fgets(s, sizeof(s), stdin);
    
    for (int i = 0; s[i] != '\0' && s[i] != '\n'; i++) {
        unsigned char c = s[i];
        if (c < 128 && !used[c]) {
            used[c] = 1;
            count++;
        }
    }
    
    printf("%d\n", count);
    
    return 0;
}
相关推荐
极地星光2 小时前
协程:实战与系统集成(高级篇)
开发语言
0和1的舞者3 小时前
《Git:从入门到精通(八)——企业级git开发相关内容》
大数据·开发语言·git·搜索引擎·全文检索·软件工程·初学者
liulilittle3 小时前
LwIP协议栈MPA多进程架构
服务器·开发语言·网络·c++·架构·lwip·通信
水淹萌龙3 小时前
玩转 Go 表达式引擎:expr 实战指南
开发语言·后端·golang
艾莉丝努力练剑3 小时前
【C++:继承】面向对象编程精要:C++继承机制深度解析与最佳实践
开发语言·c++·人工智能·继承·c++进阶
penguin_bark3 小时前
C++ 异步编程(future、promise、packaged_task、async)
java·开发语言·c++
小龙报3 小时前
《数组和函数的实践游戏---扫雷游戏(基础版附源码)》
c语言·开发语言·windows·游戏·创业创新·学习方法·visual studio
又是忙碌的一天4 小时前
Java基础 与运算
java·开发语言
liu****4 小时前
笔试强训(八)
开发语言·算法·1024程序员节