当前位置: 首页 > news >正文

「牛客网C」初学者入门训练BC139,BC158

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 ​​​​​​​

题目:BC139​​​​​​​矩阵交换

难度:中等

输入描述:

第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。接下来一行输入k,表示要执行k次操作(1≤k≤5)。接下来有k行,每行包括一个字符t和两个数a和b,中间用空格格分隔,t代表需要执行的操作,当t为字符'r'时代表进行行变换,当t为字符'c'时代表进行列变换,a和b为需要互换的行或列(1≤a≤b≤n≤10,1≤a≤b≤m≤10)。

提示:当t为别的字符时不需要处理

事例1:

输入:

2 2
1 2
3 4
1
r 1 2

输出:

3 4 
1 2 

事例2:

输入:

2 2
1 3
6 8
2
c 1 2
t 1 2

输出:

3 1 
8 6 

说明:当t为别的字符时不需要处理,所以只交换了原矩阵的第1列和第2列。

解题思路:我们可以通过两个数进行交换值举一反三,交换两个数的值需要用临时变量保存其中一个值,矩阵行列交换时也是一样,创建一个数组长度和和列数相等(长度和行数相等)去保存所要交换行的数据(列的数据),这样就可以实现矩阵的行列交换了

解题详细过程: 

#include<stdio.h>
int main(){

    int n=0,m=0;
    printf("请输入矩阵\n");
    scanf("%d %d",&n,&m);
    int k=0;
    int arr[n][m];
    printf("请输入矩阵\n");
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&arr[i][j]);
        }
    }
    printf("请输入操作几次\n");
    scanf("%d",&k);
    int a=0,b=0;
    while(k--){
        char temp=0;
        getchar();//因为scanf输入数据时,会在缓冲区留下回车的数据,所以得用getchar()清除
        printf("请输入操作符\n");
        scanf("%c",&temp);
        getchar();//因为scanf输入数据时,会在缓冲区留下回车的数据,所以得用getchar()清除
        printf("请输入操作行列数\n");
        scanf("%d %d",&a,&b);
        int brr[m];//由于C99是支持变长数组的,创建数组用于保存a行的数据
        if(temp=='r'){
            for(int i=0;i<m;i++){
                brr[i]=*(arr[a-1]+i);
                }
            for(int i=0;i<m;i++){
                *(arr[a-1]+i)=*(arr[b-1]+i);
                }
             for(int i=0;i<m;i++){
                *(arr[b-1]+i)=brr[i];
                }
            }
        int crr[n];//由于C99是支持变长数组的,创建数组用于保存a列的数据
        if(temp=='c'){
            for(int i=0;i<n;i++){
                crr[i]=arr[i][a-1];
            }
            for(int i=0;i<n;i++){
                arr[i][a-1]=arr[i][b-1];
            }
            for(int i=0;i<n;i++){
                arr[i][b-1]=crr[i];
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

题目:BC158回文数

难度:中等

描述:

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

又如:对于10进制数87:

STEP1:87+78  = 165                       STEP2:165+561 = 726

STEP3:726+627 = 1353                STEP4:1353+3531 = 4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10或N=16)进制数M(100位之内),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!” 

进制N>10时,使用大写'A'字母表示10,'B'表示11,...,'F'表示15 

输入描述:

两行,分别为N,M

输出描述:

STEP=ans

事例1:

输入:

9
87

输出:

STEP=6

解题思路:首先得把输入的不是十进制的数转换为十进制的数,然后实现一个函数去求它的回文数

解题详细过程: 

#include<stdio.h>
#include<math.h>
#include<string.h>
int judge(long p){
    long q=0;
    long num=p;
    long mul=p;
    int count=0;
    while(num){
        num=num/10;
        count++;
    }
    while(p){
        q+=(p%10)*pow(10,count-1);
        count--;
        p/=10;
    }
    if(mul==q){
        return 1;
    }
    return 0;
}
void HuiWen(long p){
    long q=0;
    int flag=0;
    for(int i=0;i<30;i++){
        long num=p;
        int count=0;
        while(num){
            num=num/10;
            count++;
        }
        while(p){
            q+=(p%10)*pow(10,count-1);
            count--;
            p/=10;
        }
        p=q+p;
        printf("p=%ld\n",p);
        int ret=judge(p);
        if(ret==1){
            printf("STEP=%d\n",i);
            flag=1;
            break;
        }
    }
    if(flag==0){
        printf("Impossible!\n");
    }
}
int main(){
    printf("请输入进制数\n");
    int N=0,M=0,i=0;
    scanf("%d",&N);
    long P=0;
    if(N<=10&&N>1){//小于10进制的数
        printf("请输入操作数\n");
        scanf("%d",&M);
        while(M){
            P+=(M%10)*pow(N,i);
            i++;
            M/=10;
        }
        HuiWen(P);
    }
    else if(N>10&&N<=16){//大于10的进制数
        printf("请输入操作数\n");
        char arr[100]={0};
        getchar();
        gets(arr);
        int ret=(int)strlen(arr);
        printf("操作数长度为");
        printf("ret=%d \n",ret);
        for(int k=0;k<ret;k++){
            if(70<arr[k]||arr[k]<65){
                P+=(arr[k]-48)*pow(N,ret-k-1);
            }
            else{
                P+=(arr[k]-55)*pow(N,ret-k-1);
            }
        }
        printf("p的值为%ld\n",P);
        HuiWen(P);
    }
    else{
        printf("只能计算2~16进制的数\n");
    }
    return 0;
}

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸

相关文章:

  • ESP32设备驱动-MAX30100心率监测传感器驱动
  • SpringMVC常见面试题(2023最新)
  • Linux系统下搭建maven环境
  • java:自定义变量加载到系统变量后替换shell模版并执行shell
  • Apollo(阿波罗)分布式配置安装详解
  • chatgpt的原理 第四部分
  • Gehpi的网络布局
  • go进阶(2) -深入理解Channel实现原理
  • 【数据库】 SQLServer
  • 【基础算法】二分例题(我在哪?)
  • ChatGPT 的盈利潜力:我使用语言模型赚取第一笔钱的个人旅程
  • 推荐算法——NCF知识总结代码实现
  • 刷题专练之数组移除元素
  • Vue 3第二章:Vite文件目录结构及SFC语法
  • 从0开始写Vue项目-Vue实现用户数据批量上传和数据导出
  • Linux 常用命令
  • 基于pytorch实现模型剪枝
  • 智慧物联网系统源码:一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台
  • QT基础入门【调试篇】QT远程部署与调试嵌入式ARM开发板
  • JavaScript 中的设计模式:创建模式
  • 普京宣布临时停火30小时
  • 全国首家由司法行政部门赋码登记的商事调解组织落户上海
  • 礼来公布口服降糖药积极结果,或年底前提交用于体重管理上市申请
  • 全球建筑瞭望|与自然共呼吸的溪谷石舍与海边公共空间
  • 睿远基金傅鹏博、赵枫股票仓位再提升,寒武纪、分众传媒分别首进持仓前十
  • 纳指收跌超3%,英伟达重挫逾6%,鲍威尔发出强烈警告