🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
题目: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列。
解题思路:我们可以通过两个数进行交换值举一反三,交换两个数的值需要用临时变量保存其中一个值,矩阵行列交换时也是一样,创建一个数组长度和和列数相等(长度和行数相等)去保存所要交换行的数据(列的数据),这样就可以实现矩阵的行列交换了
解题详细过程:
1. #include<stdio.h> 2. int main(){ 3. 4. int n=0,m=0; 5. printf("请输入矩阵\n"); 6. scanf("%d %d",&n,&m); 7. int k=0; 8. int arr[n][m]; 9. printf("请输入矩阵\n"); 10. for(int i=0;i<n;i++){ 11. for(int j=0;j<m;j++){ 12. scanf("%d",&arr[i][j]); 13. } 14. } 15. printf("请输入操作几次\n"); 16. scanf("%d",&k); 17. int a=0,b=0; 18. while(k--){ 19. char temp=0; 20. getchar();//因为scanf输入数据时,会在缓冲区留下回车的数据,所以得用getchar()清除 21. printf("请输入操作符\n"); 22. scanf("%c",&temp); 23. getchar();//因为scanf输入数据时,会在缓冲区留下回车的数据,所以得用getchar()清除 24. printf("请输入操作行列数\n"); 25. scanf("%d %d",&a,&b); 26. int brr[m];//由于C99是支持变长数组的,创建数组用于保存a行的数据 27. if(temp=='r'){ 28. for(int i=0;i<m;i++){ 29. brr[i]=*(arr[a-1]+i); 30. } 31. for(int i=0;i<m;i++){ 32. *(arr[a-1]+i)=*(arr[b-1]+i); 33. } 34. for(int i=0;i<m;i++){ 35. *(arr[b-1]+i)=brr[i]; 36. } 37. } 38. int crr[n];//由于C99是支持变长数组的,创建数组用于保存a列的数据 39. if(temp=='c'){ 40. for(int i=0;i<n;i++){ 41. crr[i]=arr[i][a-1]; 42. } 43. for(int i=0;i<n;i++){ 44. arr[i][a-1]=arr[i][b-1]; 45. } 46. for(int i=0;i<n;i++){ 47. arr[i][b-1]=crr[i]; 48. } 49. } 50. } 51. for(int i=0;i<n;i++){ 52. for(int j=0;j<m;j++){ 53. printf("%d ",arr[i][j]); 54. } 55. printf("\n"); 56. } 57. return 0; 58. }
题目: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
解题思路:首先得把输入的不是十进制的数转换为十进制的数,然后实现一个函数去求它的回文数
解题详细过程:
1. #include<stdio.h> 2. #include<math.h> 3. #include<string.h> 4. int judge(long p){ 5. long q=0; 6. long num=p; 7. long mul=p; 8. int count=0; 9. while(num){ 10. num=num/10; 11. count++; 12. } 13. while(p){ 14. q+=(p%10)*pow(10,count-1); 15. count--; 16. p/=10; 17. } 18. if(mul==q){ 19. return 1; 20. } 21. return 0; 22. } 23. void HuiWen(long p){ 24. long q=0; 25. int flag=0; 26. for(int i=0;i<30;i++){ 27. long num=p; 28. int count=0; 29. while(num){ 30. num=num/10; 31. count++; 32. } 33. while(p){ 34. q+=(p%10)*pow(10,count-1); 35. count--; 36. p/=10; 37. } 38. p=q+p; 39. printf("p=%ld\n",p); 40. int ret=judge(p); 41. if(ret==1){ 42. printf("STEP=%d\n",i); 43. flag=1; 44. break; 45. } 46. } 47. if(flag==0){ 48. printf("Impossible!\n"); 49. } 50. } 51. int main(){ 52. printf("请输入进制数\n"); 53. int N=0,M=0,i=0; 54. scanf("%d",&N); 55. long P=0; 56. if(N<=10&&N>1){//小于10进制的数 57. printf("请输入操作数\n"); 58. scanf("%d",&M); 59. while(M){ 60. P+=(M%10)*pow(N,i); 61. i++; 62. M/=10; 63. } 64. HuiWen(P); 65. } 66. else if(N>10&&N<=16){//大于10的进制数 67. printf("请输入操作数\n"); 68. char arr[100]={0}; 69. getchar(); 70. gets(arr); 71. int ret=(int)strlen(arr); 72. printf("操作数长度为"); 73. printf("ret=%d \n",ret); 74. for(int k=0;k<ret;k++){ 75. if(70<arr[k]||arr[k]<65){ 76. P+=(arr[k]-48)*pow(N,ret-k-1); 77. } 78. else{ 79. P+=(arr[k]-55)*pow(N,ret-k-1); 80. } 81. } 82. printf("p的值为%ld\n",P); 83. HuiWen(P); 84. } 85. else{ 86. printf("只能计算2~16进制的数\n"); 87. } 88. return 0; 89. }
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸