进制转换
题目描述:
第一行输入一个数n,表示第二行输入的数个数。第二行输入n个数,每个数第一个字母为大写字母表示进制,如A表示11进制,Z表示36进制,如果后面的数不符合该进制的表示,则输出-1。如果都满足,则输出最小的十进制数。
输入样例1:
3
A15 B10 Cb
输出样例1:
11
样例说明:
A为11进制的数,则十进制数为16,B为12进制数,则十进制数为12,C为13进数,则十进制数为11。所以输出为11。
输入样例2:
5
A15 B10 Cd
输出样例1:
-1
样例说明:
因为C是13进制的数,d不符合13进制的表示,所以输入-1。
思路:
A到Z表示为11进制到36进制,后面的数要符合表示,如C为13进制,有效的表示为0~9和a(10),b(11),c(12),而d(13)不符合。
代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int n,flag=0,min=10000; //flag用于判断是否有表示错误的数
int sum,jin; //jin表示进制数
char x[100];
scanf("%d",&n);
while(n--)
{
sum=0;
scanf("%s",&x); //输入每一个数,以字符串输入
int len=strlen(x); //计算字符串长度
int jin=x[0]-54; //将第一个大写字符转化出相应的进制
for(int i=1;i<len;i++) //用于判断该数是否表示错误
if(x[i]>='a'&&x[i]<='z'&&jin<=x[i]-87) //用ASCII来判断
flag=1;
if(flag==1) //如果表示错误,立刻结束
break;
else
{
for(int i=1;i<len;i++)
{
if(x[i]>='1'&&x[i]<='9') //将数字转换为十进制数
sum=sum+(x[i]-'0')*pow(jin,len-i-1);
if(x[i]>='a'&&x[i]<='z') //将字母转化为十进制数
sum=sum+(x[i]-87)*pow(jin,len-i-1);
}
if(sum<min) //用于判断最小值
min=sum;
}
}
if(flag==0) printf("\n%d",min);
else printf("-1");
return 0;
}