「牛客网C」初学者入门训练BC139,BC158
🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
难度:中等
输入描述:
第一行包含两个整数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;
}
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸