Description
程序猴子BMan致力于提升自己的bigger,有一天他得到一本《程序员装X手册10则》,里面的内容是这样的:
0.从零开始计数
1.使用二进制
领悟到这本书的内涵后BMan感慨万千,从那以后很长的一段时间他一直在使用二进制提升自己的bigger,后来他终于被0和1逼成了神经病。
但是BMan并没有就此罢休,他现在还发明了一种比二进制bigger更高的东西"六十四进制"。
BMan的六十四进制是这样的:["0~9","a~z","A~Z",#$] 这六十四个字符分别表示0~63这六十四个数, 0~9表示0~9,a~z表示10~35,A~Z表示36~61,#表示62,$表示63。 于是1a表示74,a$表示703。现在BMan想要一个能把六十四进制数转化成十进制的程序,你能帮他吗?
Input
输入文件的第一行为一个正整数T,表示有T组测试数据,接下来有T行,每行都有一个需要转化成十进制 数的六十四进制数,并且保证了这些数转成十进制数后的范围为[0,2^31)
Output
每组测试数据的输出占一行,既转换后的十进制数
Sample Input
3
10
1a
a$
Sample Output
64
74
703
单个读取位数计算值然后累加。
理解z=a[j]-39-'0'; a[j]-39得出的是ASCii码的值 减去'0',则变成
整型值,赋值给整型变量z。
本题六十四进制计算方法同二进制,从右至左,第0位的值乘以
64的0次方,第一位的值乘以64的1次方......依次累加计算值。
代码如下:
#include
#include
#include
using namespace std;
int main()
{
int t;scanf("%d",&t);
while(t--)
{
char a[1000];
scanf("%s",a);
int len,s=0,z,c;
len=strlen(a);
for(int j=0;j
='0'&&a[j]<='9') z=a[j]-'0'; //第j位的值
else if(a[j]>='a'&&a[j]<='z') z=(a[j]-39-'0');
else if(a[j]>='A'&&a[j]<='Z') z=(a[j]+19-'0');
else if(a[j]==35) z=62;
else if(a[j]==36) z=63;
c=pow(64,len-j-1); //第几位(从左向右)就是64的几次方
s+=z*c; //累加成十进制的值
}
printf("%d\n",s);
}
return 0;
}
博客已搬:
洪学林博客