原题见poj:http://acm.pku.edu.cn/JudgeOnline/problem?id=1546
题目意思简单描述:实现16以内的进制之间的转换(其实可以扩展到36以内的进制之间的转换)
主要思路:以十进制数为中间结果,先转换为十进制,然后转换为要求的进制。任意进制转换为十进制采用位权表示法,十进制转换为任意进制采用
整除和取余,采用堆栈的数据结构。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char fin[100];
int convent1(char ch[],int base)
{
int len = strlen(ch);
int i;
int temp;
int re=0;
for(i=0;i<len;i++)
{
if(ch[i]=='A')
temp = 10;
if(ch[i]=='B')
temp = 11;
if(ch[i]=='C')
temp = 12;
if(ch[i]=='D')
temp = 13;
if(ch[i]=='E')
temp = 14;
if(ch[i]=='F')
temp = 15;
if(ch[i]=='0')
temp = 0;
if(ch[i]=='1')
temp = 1;
if(ch[i]=='2')
temp = 2;
if(ch[i]=='3')
temp = 3;
if(ch[i]=='4')
temp = 4;
if(ch[i]=='5')
temp = 5;
if(ch[i]=='6')
temp = 6;
if(ch[i]=='7')
temp = 7;
if(ch[i]=='8')
temp = 8;
if(ch[i]=='9')
temp = 9;
re = re+temp*pow((double)base,(double)len-1-i);
}
return re;
}
void convent2(int num,int base)
{
char chan[100];
char res[100];
int temp;
int top = 0;
while(num)
{
temp = num%base;
num = num/base;
if(temp==0)
chan[top]='0';
if(temp==1)
chan[top]='1';
if(temp==2)
chan[top]='2';
if(temp==3)
chan[top]='3';
if(temp==4)
chan[top]='4';
if(temp==5)
chan[top]='5';
if(temp==6)
chan[top]='6';
if(temp==7)
chan[top]='7';
if(temp==8)
chan[top]='8';
if(temp==9)
chan[top]='9';
if(temp==10)
chan[top]='A';
if(temp==11)
chan[top]='B';
if(temp==12)
chan[top]='C';
if(temp==13)
chan[top]='D';
if(temp==14)
chan[top]='E';
if(temp==15)
chan[top]='F';
top++;
}
int i=0;
for(top--;top>=0;top--)
{
res[i] = chan[top];
i++;
}
res[i]='\0';
strcpy(fin,res);//strcpy()函数的参数是字符串,那么在字符数组最后要加上'\0',不然就会出现异常
}
int main()
{
int base,changeTo;
char str[100];
int mid;
int len;
while(scanf("%s%d%d",str,&base,&changeTo)!=EOF)
{
mid = convent1(str,base);
convent2(mid,changeTo);
len = strlen(fin);
if(len>7)
printf("%s\n"," ERROR");
else
printf("%7s\n",fin);
}
return 0;
}
其实,用java中BigInteger可以更加简单的实现
BigInteger(String val, int radix)
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。
toString
public String toString(int radix)
-
返回此 BigInteger 的给定基数的字符串表示形式。如果该基数超出从
Character.MIN_RADIX
到Character.MAX_RADIX
(包括)这一范围,则其默认值为 10( Integer.toString 就是这种情况)。使用由 Character.forDigit 提供的从数字到字符的映射,并在需要时在前面加一个负号。(此表示形式与(String,
构造方法兼容。)int
) -
-
- 参数:
-
radix
- 字符串表示形式的基数。 - 返回:
- 此 BigInteger 给定基数的字符串表示形式。
- 另请参见:
-
Integer.toString(int, int)
,Character.forDigit(int, int)
,BigInteger(java.lang.String, int)
采用以上便可以实现36以内任意进制的转换:例如
import java.math.BigInteger;
public class Main1546 {
/**
* @param args
这里只是演示一下功能
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "1A"; //原始字符串
BigInteger big = new BigInteger(str,15);//以15进制的字符串str构造一个BigInteger
String str1 = big.toString(2); //将这个15进制转换为2进制表示的字符串
System.out.println(str1); //呵呵,简单吧
}
}