您的位置:首页 > 其它

POJ 1220 大数任意进制转换

2011-05-04 15:31 375 查看
Writeaprogramtoconvertnumbersinonebasetonumbersinasecondbase.Thereare62differentdigits:
{0-9,A-Z,a-z}
HINT:Ifyoumakeasequenceofbaseconversionsusingtheoutputofoneconversionastheinputtothenext,whenyougetbacktotheoriginalbase,youshouldgettheoriginalnumber.

SampleInput

8
622abcdefghiz
10161234567890123456789012345678901234567890
16353A0C92075C0DBF3B8ACBC5F96CE3F0AD2
3523333YMHOUE8JPLT7OX6K9FYCQ8A
2349946B9AA02MI37E3D3MMJ4G7BL2F05
49611VbDkSIMJL3JjRgAdlUfcaWj
615dl9MDSWqwHjDnToKcsWE1S
51042104444441001414401221302402201233340311104212022133030

SampleOutput

62abcdefghiz
211011100000100010111110010010110011111001001100011010010001

101234567890123456789012345678901234567890
163A0C92075C0DBF3B8ACBC5F96CE3F0AD2

163A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35333YMHOUE8JPLT7OX6K9FYCQ8A

35333YMHOUE8JPLT7OX6K9FYCQ8A
23946B9AA02MI37E3D3MMJ4G7BL2F05

23946B9AA02MI37E3D3MMJ4G7BL2F05
491VbDkSIMJL3JjRgAdlUfcaWj

491VbDkSIMJL3JjRgAdlUfcaWj
61dl9MDSWqwHjDnToKcsWE1S

61dl9MDSWqwHjDnToKcsWE1S
542104444441001414401221302402201233340311104212022133030

542104444441001414401221302402201233340311104212022133030
101234567890123456789012345678901234567890


题意就是说将M进制的大数转换成N进制。高精度不熟悉,参考洞庭散人的一篇文章浅谈大数的进制转换

感谢散人。

AC代码:

#include"stdio.h"
#include"string.h"
charstr[1000];
intstart[1000],ans[1000],res[10000];//被除数商余数
intbase1,base2;
voidchange()
{
inti,len=strlen(str);
start[0]=len;
for(i=1;i<=len;i++)
{
if(str[i-1]>='0'&&str[i-1]<='9')
start[i]=str[i-1]-'0';
elseif(str[i-1]>='a'&&str[i-1]<='z')
start[i]=str[i-1]-'a'+36;
else
start[i]=str[i-1]-'A'+10;
}
}
voidsolve()
{
memset(res,0,sizeof(res));
inty,i,j;
//先余低位,后余高位
while(start[0]>=1)//知道被除数等于0
{
y=0;i=1;
ans[0]=start[0];
while(i<=start[0])
{
y=y*base1+start[i];
ans[i++]=y/base2;
y%=base2;
}
res[++res[0]]=y;
i=1;
while((i<=ans[0])&&(ans[i]==0))i++;
memset(start,0,sizeof(start));
for(j=i;j<=ans[0];j++)
start[++start[0]]=ans[j];
memset(ans,0,sizeof(ans));
}
}
voidoutput()
{
printf("%d%s\n%d",base1,str,base2);
inti;
for(i=res[0];i>=1;i--)
{
if(res[i]>=0&&res[i]<=9)
printf("%d",res[i]);
elseif(res[i]>=10&&res[i]<=35)
printf("%c",'A'+res[i]-10);
elseprintf("%c",'a'+res[i]-36);
}
printf("\n\n");
}
intmain()
{
intn;
//freopen("a.in","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&n);
while(n--)
{
scanf("%d%d%s",&base1,&base2,str);
change();
solve();
output();
}
return0;
}


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: