您的位置:首页 > 其它

九度OJ 题目1118:数制转换

2015-09-05 15:53 204 查看
一.题目描述:

求任意两个不同进制非负整数的转换(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

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

二.题目分析

模拟长整数除法

三.代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
int a,b,i,j,k,n,num[1000],to[9999],jie,chu;
char str[1000];

int t;

while(scanf("%d%s%d",&a,str,&b)!=EOF)
{
for(i=0;str[i];i++)
{
if('0'<=str[i]&&str[i]<='9')
num[i]=str[i]-'0';
else if('A'<=str[i]&&str[i]<='Z')
num[i]=str[i]-'A'+10;
else
num[i]=str[i]-'a'+10;
}

n=i;k=0;
while(1)
{
i=0;
while(num[i]==0&&i<n)  //注意i<n条件一定不能忘记,错了好多回了...
i++;
if(i==n)
break;

jie=0;
for(j=i;j<n;j++)
{
chu=jie*a+num[j];
num[j]=chu/b;
jie=chu%b;
}
to[k++]=jie;
}

if(k==0)
printf("0\n");
else
{
for(i=k-1;i>=0;i--)
{
//printf("to=%d\n",to[i]);
if(to[i]>=10)
printf("%c",to[i]-10+'A');
else
printf("%c",to[i]+'0');
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: