主页 > 电脑硬件  > 

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

「牛客网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; }

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

标签:

「牛客网C」初学者入门训练BC139,BC158由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“「牛客网C」初学者入门训练BC139,BC158