2024/3/15 C语言刷题笔记

1.输入一串字符(长度不超过100)和一个正整数k,将其中的英文字母加密并输出加密后的字符串,非英文字母不变。加密思想:将每个字母c加一个序数k,即用它后面的第k个字母代替,变换公式:c=c+k。如果字母为z,则后一个字母是a,也就是字母字符形成一个圆。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
    int k;
    char str[101];
    gets(str);
    scanf("%d",&k);
    for(int i=0;str[i]!='\0';i++)
    {
        if(isalpha(str[i])){
            int temp;
            char base=isupper(str[i])?'A':'a';
            temp=(((str[i]-base)+k)%26)+base;
            str[i]=(char)temp;
        }
    }

    puts(str);
}

2.计算两个矩阵A和B的乘积。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
    int m,p,n;
    scanf("%d%d%d",&m,&p,&n);
    int A[m][p],B[p][n];
    for(int i=0;i<m;i++){
        for(int j=0;j<p;j++){
            scanf("%d",&A[i][j]);
        }
        getchar();
    }
    for(int i=0;i<p;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&B[i][j]);
        }
        getchar();
    }
    int C[m][n];
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            C[i][j]=0;
            for(int k=0;k<p;k++)
                C[i][j]+=A[i][k]*B[k][j];
        }
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
            printf("%d ",C[i][j]);
        printf("\n");
    }
    return 0;


}

3.输入一个字符串,判断其是否是C的合法标识符。C语言中规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
    char str[51];
    gets(str);
    if(str[0]=='_'||isalpha(str[0]));
    else
    {
        printf("no\n");
        return 0;
    }
    for(int i=0;str[i]!='\0';i++)
    {
        if(!(isalnum(str[i])||str[i]=='_'))
        {
            printf("no\n");
            return 0;
        }
    }
    printf("yes\n");
    return 0;
}

4.计算机数据都是由0和1组成的,看着长长的0101001110101111011,要找出连续n个1的子串有多少个,确实麻烦,请你编程实现吧。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
    char str[1001];
    gets(str);
    int n;
    scanf("%d",&n);
    int len=0;
    int count=0;
    for(int i=0;str[i]!='\0';i++)
    {
        while(str[i]=='1')
        {
            len++;
            i++;
            if(len==n)
            {
                count++;
                len=n-1;   //代码核心
            }
        }
        len=0;
    }
    printf("%d\n",count);
    return 0;
}

5.英文字母里出现频率最高的是哪个字母呢? 给定一个字符串,输出字符串中出现次数最多的字母

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
    char str[101];
    gets(str);
    int hash[26]={0};
    for(int i=0;str[i]!='\0';i++)
    {
        if(isalpha(str[i]))
        {
            char base=isupper(str[i])?'A':'a';
            hash[str[i]-base]++;
        }
    }
    int max=0;
    for(int i=1;i<26;i++)
    {
        if(hash[i]>hash[max])
        {
            max=i;
        }
    }
    printf("%c\n",'a'+max);
    return 0;
}

6.输入n个数,每个数的进制由其后面的数字k指定,k>=2且k<=10, 输出最大的数对应的十进制数。 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int KToD(char str[],int k)
{
    int res=0;
    for(int i=0;str[i]!='\0';i++)
    {
        res=res*k+str[i]-'0';
    }
    return res;
}
int main()
{
    char str[101];
    int n,k;
    scanf("%d",&n);
    int max=-1;
    for(int i=0;i<n;i++)
    {
        scanf("%s%d",str,&k);
        int temp=KToD(str,k);
        if(temp>max)
        {
            max=temp;
        }
    }
    printf("%d\n",max);


    return 0;
}

7.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int q;
    scanf("%d",&q);
    long long res;
    long long n;
    int k;
    for(int i=0; i<q; i++){
        res=1;
        n=0;
        k=0;
        scanf("%lld%d",&n,&k);
        for(int j=2; j<=(int)sqrt(n);j++){
            int coef=0;
            while(n%j==0){
                n/=j;
                coef++;
            }
            if(coef>=k)
                res*=pow(j,coef);
        }
        printf("%lld\n",res);
    }
    return 0;
}

8.n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。(约瑟环问题)

#include <stdio.h>
int findMonkeyKing(int n,int m){
    int i,last = 0;
    for(i=2;i<=n;i++){
        last=(last+m)%i;
    }
    return last+1;
}

int main()
{
    int n, m;
    scanf("%d %d",&n,&m);
    int monkeyKing=findMonkeyKing(n,m);
    printf("%d\n",monkeyKing);
    return 0;
}

9.读入一个实数,输出实数的整数部分。注意该实数的位数不超过100位。输入的整数部分可能含有不必要的前导0,输出时应去掉,当然,若整数部分为0,则该0不能去掉。如输入0023.56732,输出应为23,而不是0023;0.123对应的输出应为0。当然输入也可能不含小数部分。
要求定义并使用rounding()函数,原型如下:
char *rounding(char *p)
{
//将字符串p表示的实数取整后生成新的字符串,并由函数返回
}

#include<stdio.h>
#include<string.h>
#include<ctype.h>
char* rounding(char* p){
    static char result[101];
    int i=0,j=0,hasNonZero=0;
    while(p[i]=='0'&&p[i]!='.'&&p[i]!='\0')
        i++;
    while(p[i]!='\0'&&p[i]!='.')
    {
        result[j++]=p[i++];
        hasNonZero=1;
    }
    if(!hasNonZero)
        result[j++]='0';
    result[j]='\0';
    return result;
}

int main(){
    char num[101];
    scanf("%s",num);
    char* integerPart=rounding(num);
    printf("%s\n",integerPart);
    return 0;
}

10.有n个整数,使前面各数顺序向后移动k个位置,移出的数再从开头移入。输出移动后的数组元素。
题目没有告诉你n的范围,希望你读入n之后用malloc()函数动态申请内存空间,不要提前定义数组的大小。不要偷懒哦。
另外要求定义并使用函数ringShift()
void ringShift(int *a, int n, int k)
{
//循环移动后的数值仍然存入数组a中
}

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
void ringShift(int *a, int n, int k)
{
    int *b=malloc(sizeof(int)*n);
    for(int i=0;i<n;i++)
        b[(i+k)%n]=a[i];
    for(int i=0;i<n;i++)
        a[i]=b[i];
}
int main()
{
    int n;
    scanf("%d",&n);
    int *a=malloc(sizeof(int)*n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int k;
    scanf("%d",&k);
    ringShift(a,n,k);
    for(int i=0;i<n;i++)
        printf("%d ",a[i]);
    return 0;
}

11.输入一个字符串,由空格、英文字母、数字组成,以回车结束,长度小于1000。注意:010是两个数字,0和10

#include <stdio.h>
#include <string.h>
int main() {
    char str[101];
    gets(str);
    int count=0;
    for(int i=0;str[i]!='\0';i++)
    {
        if(str[i]=='0')
            count++;
        if(str[i]>='1'&&str[i]<='9')
        {
            while(str[i+1]!='\0'&&str[i+1]>='0'&&str[i+1]<='9')
                i++;
            count++;
        }

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

12.给你一组数(未排序),请你设计一个程序:求出里面个数最多的数。并输出这个数的长度。
例如:给你的数是:1、 2、 3、 3、 4、 4、 5、 5、 5 、6, 其中只有6组数:1, 2, 3-3, 4-4, 5-5-5 and 6.
最长的是5那组,长度为3。所以输出3。

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int main() {
    int t;
    scanf("%d",&t);
    int n;
    for(int i=0;i<t;i++)
    {
        scanf("%d",&n);
        int a[n];
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        qsort(a,n,sizeof(int),cmp);
        int pre=a[0],len=0,max=0;
        for(int i=1;i<n;i++)
        {

            if(a[i]==pre)
            {
                len++;
            }
            else{
                pre=a[i];
                if(len>max)
                {
                    max=len;
                }
                len=0;
            }
        }
        if(len>max)
            max=len;
        printf("%d\n",max+1);
    }
    return 0;
}

13.找出一个2×3的整数矩阵中的最大值及其行下标和列下标,要求调用函数FindMax(int p[][3], int m, int n, int *pRow, int *pCol)实现,行下标和列下标在形参中以指针的形式返回。
void FindMax(int p[][3], int m, int n, int *pRow, int *pCol){
//在m*n矩阵p中查找最大值,将其行下标存入pRow所指内存单元,将其列下标存入pCol所指内存单元
}

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
void FindMax(int p[][3], int m, int n, int *pRow, int *pCol){
    int max=p[0][0];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(p[i][j]>max)
            {
                max=p[i][j];
                *pRow=i;
                *pCol=j;
            }
        }
    }
}
int main()
{
    int p[2][3];
    for(int i=0;i<2;i++)
        for(int j=0;j<3;j++)
            scanf("%d",&p[i][j]);
    int pRow=0,pCol=0;
    FindMax(p,2,3,&pRow,&pCol);
    printf("%d %d %d",p[pRow][pCol],pRow,pCol);
}

14.小明希望能把其余重复的数去掉,然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    qsort(a,n,sizeof(int),cmp);
    for(int i=1;i<n;i++)
    {
        if(a[i]==a[i-1])
        {
            for(int j=i;j<n;j++)
            {
                a[j]=a[j+1];
            }
            n--;
            i--;
        }
    }
    printf("%d\n",n);
    for(int i=0;i<n;i++)
        printf("%d ",a[i]);
    return 0;
}

15.输入含有一些数据组,每组数据包括菜种(不含空格的字串),数量w(计量单位不论,一律为double型数)和单价p(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价啊。菜种、数量和单价之间都有空格隔开的。试试 while( scanf("%*s%lf%lf", &w,&p) != EOF ){ }

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
    double w,p,res=0;
    while(scanf("%*s%lf%lf",&w,&p)!=EOF)
    {
        res+=w*p;
    }
    printf("%.1f\n",res);
    return 0;
}

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值