您的位置:首页 > 其它

九度1118:数制转换

2017-08-16 20:38 183 查看
题目1118:数制转换

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:6846

解决:2807

题目描述:

    求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。

    不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

输入:

    输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

    数据可能存在包含前导零的情况。

输出:

    可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

样例输入:
15 Aab3 7


样例输出:
210306


提示:

可以用字符串表示不同进制的整数。

来源:
2008年北京大学图形实验室计算机研究生机试真题

一遍AC的题。注意细节就好了,由于可能有前导0,就先拿一根指针指向起始位置,依次往后直到把0都略过去,尽量不要把自增运算符放在数组下标的后面,这样看似代码简洁,实际上不是什么好的编程习惯,容易在边缘情况下出问题,比如这道题如果这样写,那么如果遇到没有前导0的数,退出while循环后指针p的位置就不对了,之后自然全部出错(debug发现的。。。)
再一个,全程注意存储是的字符还是数字,存储是字符,运算时是数字,做好转换。
核心部分做好分情况判断就好了,三个if/else分支
只要运行时崩溃,那多半是数组越界了,看看你i--是不是又写成i++了.........
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
char list[16]={'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F'};
int main()
{
int a,b,i;
char buf[50];
while(scanf("%d%s%d",&a,buf,&b)!=EOF){
char no_zero[50],*p=buf;
while(*p=='0')
p++;
if(*p=='\0'){
printf("0\n");
continue;
}
strcpy(no_zero,p);
int len=strlen(no_zero),sum=0;
for(i=0;i<len;i++){ ///转换成十进制
if(no_zero[i]>='a'&&no_zero[i]<='f')
sum+=(no_zero[i]-87)*pow(a,len-1-i);
else if(no_zero[i]>='A'&&no_zero[i]<='F')
sum+=(no_zero[i]-55)*pow(a,len-1-i);
else
sum+=(no_zero[i]-'0')*pow(a,len-1-i);
}
i=0;
while(sum!=0){
no_zero[i++]=list[sum%b];
sum/=b;
}
for(i--;i>=0;i--){
printf("%c",no_zero[i]);
}
printf("\n");
}
return 0;
}
*******************************************************
坚持,而不是打鸡血~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息