题目
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
解题思路
因为题目上说明是32位的整数,所以用直接用int或者long long 是不行的,应该用大数的思想,对首先把存入的字符串转化成整数型数组存起来,然后按正序对每一位元素进行求余并且储存到一个字符数组里,这时候应该注意,当余数大于9的时候应该用16进制的规则储存。
注意事项
有负数进行负数的处理
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
char ch[50];
void dtor(char str[50],int r)
{
int inp[50];
char oup[50];
int l=0,len=strlen(str);
int flag=0;
if(str[0]=='-')
flag=1;
else
inp[l++]=str[0]-'0';
for(int i=1; i<len; i++)
inp[l++]=str[i]-'0';
memset(oup,'\0',sizeof(oup));
int k=0,d=0,sum=1,p=0,q=0;
while(sum)
{
sum=0;
for(int i=0; i<l; i++)
{
p=inp[i]/r;
sum+=p;//用sum进行标记商是否为零,只有商的每一位都是零的情况下商为零同时sum为零
q=inp[i]%r;
inp[i+1]+=q*10;
inp[i]=p;
if(i==l-1)
{
if(q>9)
oup[k++]=q-10+'A';
else
oup[k++]=q+'0';
}
}
}
if(k==0) cout<<"0";
else
{
if(flag==1)
cout<<"-";
for(int i=k-1; i>=0; i--)
cout<<oup[i];
}
cout<<endl;
return ;
}
int main()
{
int k;
while(cin>>ch>>k)
{
dtor(ch,k);
}
return 0;
}