C语言题目

题目描述

计算字符串最后一个单词的长度,单词以空格隔开。 

输入描述:

一行字符串,非空,长度小于5000。

输出描述:

整数N,最后一个单词的长度

#include <stdio.h>
int main(int argc, char const *argv[])
{
    char a[5000];
    gets(a);        //如果用scanf,会在空格处停止录入
    //printf("%s", a);
    int m = 0;
    for (int i = 4999; i >= 0; --i)
    {
        if ((a[i] > 64 && a[i] < 91) || (a[i] > 96 && a[i] < 123))        //判断ascii码,当它满足为字母时,计数
        {
            m++;
        }
        if (a[i] == ' ')    //一直计数,计到空格位置,并输出此时的计数值
        {
            printf("%d
", m);
            return 0;
        }
        if (i == 0)        //如果走到了数组头部,还没有空格,说明只有一个单词,那么也输出计数值
        {
            printf("%d
", m);
        }
    }
    return 0;
}

本题注意: 1、scanf()遇到空格便停止接受了,而gets()函数直到收到换行符 才会停止,所以这里用gets() 

      2、因为不确定一定有空格,所以还要考虑到输入的字符串只是一个单词的情况,当遍历过整个数组都没有找到空格时,那么认为只有一个单词


题目描述

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

输入描述:

 输入一个整数(int类型)

输出描述:

 这个数转换成2进制后,输出1的个数

#include <stdio.h>
#include <string.h>


int main(int argc, char const *argv[])
{
    int s = 0;
    scanf("%d",&s);
    int abc[32] = { 0 };        //注意数组初始化

    int tmp = 0;
    int i = 0;

    while (s > 0)    //短除法法转成二进制
    {    
        abc[i] = s % 2;
        i++;
        s = s / 2;
    }
    for (int j = 0; j < 32; j++)
    {
        if (abc[j] == 1)
        {
            tmp++;
        }
    }
    printf("%d", tmp);
    return 0;
}

本题注意:1、数组一定要初始化,否则会自动填入奇怪的值,

     2、转换二进制的方法


题目描述

写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

输入描述:

第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。

输出描述:

输出输入字符串中含有该字符的个数。

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char a[1000] = {0} ;
    char b ;
    gets(a);
    b = getchar();
    int m = 0;
    int len = strlen(a);
    for (int i = 0; i < len; i++)
    {
        if (b == a[i] || b == (a[i]-32) || a[i] == (b -32))
        {
            m++;
        }
    }
    printf("%d
", m);
    return 0;
}

本题注意:1、数组要初始化

     2、gets() 和 getchar() 的使用

     3、注意题目要求,不区分大小写,所以判断时要加入大小写的情况,大写字母ASCII码比小写字母多32


题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

Input Param

n               输入随机数的个数

inputArray      n个随机整数组成的数组

Return Value

OutputArray    输出处理后的随机整数


注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。

输入描述:

输入多行,先输入随机整数的个数,再输入相应个数的整数

输出描述:

返回多行,处理后的结果

#include<stdio.h>

int main()
{//给定范围去重
    int N, i, n;//N为数组长度    
    while (scanf("%d", &N) != EOF)
    {
        int array[1001] = { 0 };
        for (i = 0; i<N; i++)
        {
            scanf("%d", &n);
            array[n] = 1;
        }
        for (i = 0; i<1001; i++)
        {
            if (array[i] == 1)
                printf("%d
", i);
        }
    }

    return 0;
}

题目描述

输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

输入描述:

输入一个int型整数

输出描述:

按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    //输入一个整数a
    int a;
    scanf("%d", &a);

    //把a转成字符串
    char str[100] = { 0 };
    itoa(a,str,10);
    puts(str);
    
    //看看字符串有多长
    int len = strlen(str);
    printf("%d
", len);

    //首尾互相调换顺序
    int tmp = len -1;
    for (int i = 0; i < len;i++)
    {
        if (i < tmp)
        {
            change(&str[i], &str[tmp]);
            tmp--;
        }
    }
    puts(str);

    //去除重复值
    len = strlen(str);
    char new_str[100] = {0};
    new_str[0] = str[0];
    for (int i = 1, j = 1; i < len; i++)
    {
        
            if (strchr(new_str,str[i]) == 0)
            {
                new_str[j] = str[i];
                j++;
            }
        
    }
    puts(new_str);

}

int change(char *a, char *b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

本题注意:1、去除重复部分实现,我用了一个新数组承接无重复的部分,并且在每次复制元素到新数组时都用strchr()看一下是否有重复

     2、首尾调换顺序注意判断条件

 


题目描述

写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

输入描述:

输入一个正浮点数值

输出描述:

输出该数值的近似整数值

#include <stdio.h>
#include <string.h>
int main()
{
    float a ;
    scanf("%f", &a);
    //printf("%f
", a);
    int b = a;
    float tmp = a - b;
    if (tmp>=0.5)
    {
        b++;
    }

    printf("%d
", b);
}

本题注意:1、用int型去承接浮点数时,会自动去掉所有的小数位,保留到个位。


题目描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )

最后一个数后面也要有空格
 

详细描述:


函数接口说明:

public String getResult(long ulDataInput)

输入参数:

long ulDataInput:输入的正整数

返回值:

String

输入描述:

输入一个long型整数

输出描述:

按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

#include <stdio.h>
#include <string.h>
int main()
{
    int a = 0;
    scanf("%d", &a);
    int j;
    for (j = 2;j < a+1 ; j++)
    {
        if ((a % j) == 0)
        {
            printf("%d ", j);
            a = a / j;
            j = 1;
        }
    }
}

本题注意:1、变量j的取值范围,j < a+1 因为包包含等于a的情况,一旦输入的值是一个质数,需要能输出该值

     2、注意/ %的运用


题目描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。

#include <stdio.h>
#include <string.h>
int main()
{
    /*输入十六进制数*/
    char val_16[100] = { 0 };

    /*保存十进制的数*/
    int val_10 = 0;

    while (scanf("%s", val_16) != EOF)
    {
        int val_16_len = strlen(val_16);
        val_10 = 0;
        int i = val_16_len - 1;
        int j = 1;

        while (i > 1)
        {
            int tmp = 0;
            int tmp_16 = val_16[i];
            if (tmp_16 >= 48 && tmp_16 <= 57)
            {
                tmp = tmp_16 - 48;
                val_10 = val_10 + tmp * j;
            }
            else if (val_16[i] == 'A')
            {
                val_10 = val_10 + 10 * j;
            }
            else if (val_16[i] == 'B')
            {
                val_10 = val_10 + 11 * j;
            }
            else if (val_16[i] == 'C')
            {
                val_10 = val_10 + 12 * j;
            }
            else if (val_16[i] == 'D')
            {
                val_10 = val_10 + 13 * j;
            }
            else if (val_16[i] == 'E')
            {
                val_10 = val_10 + 14 * j;
            }
            else if (val_16[i] == 'F')
            {
                val_10 = val_10 + 15 * j;
            }
            i--;
            j = j * 16;
        }
        printf("%d
", val_10);
    }

}

本题我才用了判断ascii码的方式去判断某一位是否小于10,如果小于10则转换成相对应的数字,如果是字母,另外转换成数字

每向前走一位,就是多了16的几次方


题目描述

•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; 
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 

输入描述:

连续输入字符串(输入2次,每个字符串长度小于100)

输出描述:

输出到长度为8的新字符串数组

#include <stdio.h>
#include <string.h>

int main()
{
    char a[100] = {0};
    char b[100] = {0};
    gets(a);
    gets(b);

    int len_a = strlen(a);

    int len_b = strlen(b);
    
    char A[][8] = { 0 };
    char B[][8] = { 0 };

    for (int i = 0; i < 10; i++){
        if (((len_a ) % 8 )!= 0)
        {
            a[len_a] = '0';
            len_a++;
        }
    }
    for (int i = 0; i < 10; i++){
        if (((len_b ) % 8 )!= 0)
        {
            b[len_b] = '0';
            len_b++;
        }
    }
    int count_a = len_a / 8;
    int count_b = len_b / 8;
    for (int i = 0; i < count_a;i++)
    {
        for (int j = 0; j < 8;j++)
        {
            A[i][j] = a[j + i * 8];
        }
        for (int k = 0; k < 8;k++)
        {
            printf("%c", A[i][k]);
        }
        printf("
");
    }
    for (int i = 0; i < count_b; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            B[i][j] = b[j + i * 8];
        }
        for (int k = 0; k < 8; k++)
        {
            printf("%c", B[i][k]);
        }
        printf("
");
    }
    return 0;
}

使用二维数组去拆分字符串,在拆分之前, 先计算是否8的整数倍,否则补0

原文地址:https://www.cnblogs.com/qifeng1024/p/11812991.html