题意
输入一个十六进制数字(事实上是三个十六进制的数字),转换成三个十进制数字,这个十六进制数字是两位两位分开计算的
输入三个十进制数字,转换成三个十六进制的数字,一行连在一起输出
输入
150
50
76
输出
#96324c
输入
#500d01
输出
80,13,1
代码
#include<bits/stdc++.h>using namespace std;char f[10][10];int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int cnt=0;while(scanf("%s",f[cnt])!=EOF){cnt++;}if(cnt==1){for(int i=0,j=1;i<3;i++,j+=2){int x=0;if(f[0][j]>='a') x+=(f[0][j]-87)*16;else x+=(f[0][j]-'0')*16;if(f[0][j+1]>='a') x+=f[0][j+1]-87;else x+=f[0][j+1]-'0';cout<<x;if(i!=2) cout<<",";}}else{cout<<"#";for(int i=0;i<3;i++){int res=0;int len=strlen(f[i]);for(int j=0;j<len;j++){res=res*10+f[i][j]-'0';}printf("%02x",res);}}puts("");return 0;
}
总结
1.细节非常多
比如说我在本地运行不了,应该是因为我无法结束输入,还有如果不加 !=EOF,代码会超时,二维字符数组可以用%s逐行输入,可以用strlen函数对二维字符数组逐行计算长度,%02x表示宽度为2的十六进制输出,不足2的用0补足,'a’的ASCII码是97,十六进制里面的a是10,所以代码里面减去了87
2.输入十六进制就只有一行
所以cnt=1表示的是十六进制转十进制,从第二位开始处理,因为第一位#是无效的
3.进制转换比较常规
不再赘述
到这里结束,就把60题的简单和中等题都做了一遍了,还是那句话,希望程设能过