明明是AC过一次的题,第二次来做却AC不了了,自己也没想通错在哪。题目如下
http://ac.jobdu.com/problem.php?pid=1080
进制转换问题,基本思路是把m进制数先转换成10进制数,在将10进制数转换成n进制数。转换成10进制,即每个位上的数值乘以对应的位权然后全部加起来,再转换成n进制,就是不断modn再除以n。当然,既然有大数,要构造bigint数据结构,重载相关的计算。以前的AC代码如下:
#include <stdio.h>
#include <string.h>
#define MAX 100
struct bigint
{
int digit[MAX];
int size;
void init()
{
size=0;
for (int i=0;i<MAX;++i)
{
digit[i]=0;
}
}
bigint operator + (const bigint &a) const
{
bigint res;
res.init();
res.size=size>a.size?size:a.size;
int c=0;
for (int i=0;i<res.size;++i)
{
int temp=digit[i]+a.digit[i]+c;
if (temp>9999)
{
c=temp/10000;
res.digit[i]=temp%10000;
}
else
{
c=0;
res.digit[i]=temp;
}
}
if (c!=0) res.digit[res.size++]=c;
return res;
}
bigint operator * (const int a) const
{
int c=0;
bigint res;
res.init();
res.size=size;
for (int i=0;i<size;++i)
{
int temp=digit[i]*a+c;
if (temp>9999)
{
c=temp/10000;
res.digit[i]=temp%10000;
}
else
{
c=0;
res.digit[i]=temp;
}
}
if (c!=0) res.digit[res.size++]=c;
return res;
}
bigint operator / (const int a) const
{
bigint res;
res.init();
res.size=size;
int c=0;
for (int i=size-1;i>=0;--i)
{
res.digit[i]=(digit[i]+c*10000)/a;
c=(digit[i]+c*10000)%a;
}
for (int i=0;i<size;++i)
if (digit[i]!=0) res.size=i;
++res.size;
return res;
}
int operator % (const int a) const
{
int c=0;
for (int i=size-1;i>=0;--i)
{
c=(digit[i]+c*10000)%a;
}
return c;
}
}w, interm;
int main()
{
int m,n;
char s[10000];
char ans[10000];
while (scanf("%d %d %s", &m,&n,s)!=EOF)
{
bool flag=false;
if (s[0]=='-')
{
flag=true;
int l=strlen(s);
for (int i=0;i<l;++i)
{
s[i]=s[i+1];
}
}
interm.init();
w.init();
w.digit[0]=1;
w.size=1;
int len=strlen(s);
for (int i=len-1;i>=0;--i)
{
if (s[i]>='0'&&s[i]<='9')
interm=interm+w*(s[i]-'0');
else
interm=interm+w*(s[i]-'A'+10);
w=w*m;
}
int ansl=0;
while (interm.digit[0]!=0||interm.size!=1)
{
int temp=interm%n;
if (temp<10) ans[ansl++]='0'+temp;
else ans[ansl++]='a'+temp-10;
interm=interm/n;
}
if (ansl==0) printf("0\n");
else
{
if (flag) printf("-");
for (int i=ansl-1;i>=0;--i)
printf("%c", ans[i]);
printf("\n");
}
}
return 0;
}
写得比较粗糙,可是第二次的代码,我觉得跟AC的差不多,只是不重要的东西不太一样,不知道为啥不能AC,希望有热心的人帮我找找原因,如下
#include <stdio.h>
#include <string.h>
typedef struct bigint
{
int digit[1000];
int size;
void init(int x)
{
for (int i=0;i<1000;++i)
digit[i]=0;
size=1;
digit[0]=x;
}
bigint operator + (const bigint &a) const
{
bigint ret;
ret.init(0);
int c=0;
for (int i=0;i<size||i<a.size;++i)
{
ret.digit[i]=(digit[i]+a.digit[i]+c)%1000;
c=(digit[i]+a.digit[i]+c)/1000;
ret.size=i;
}
++ret.size;
if (c!=0)
ret.digit[ret.size++]=c;
return ret;
}
bigint operator * (const int &a) const
{
bigint ret;
ret.init(0);
int c=0;
for (int i=0;i<size;++i)
{
ret.digit[i]=(digit[i]*a+c)%1000;
c=(digit[i]*a+c)/1000;
ret.size=i;
}
++ret.size;
if (c!=0)
ret.digit[ret.size++]=c;
return ret;
}
bigint operator / (const int &a) const
{
bigint ret;
ret.init(0);
ret.size=size;
int c=0;
for (int i=size-1;i>=0;--i)
{
ret.digit[i]=(c*1000+digit[i])/a;
c=(c*1000+digit[i])%a;
if (ret.digit[i]==0) --ret.size;
}
return ret;
}
int operator % (const int &a) const
{
int c=0;
for (int i=size-1;i>=0;--i)
{
c=(c*1000+digit[i])%a;
}
return c;
}
}bigint;
char s[10000];
int ans[10000];
int main()
{
int m,n;
while (scanf("%d %d",&m,&n)!=EOF)
{
scanf("%s",s);
int len=strlen(s);
bool flag=false;
if (s[0]=='-') //第一次WA没有考虑负数情况
{
flag=true;
--len;
for (int i=0;i<len;++i)
s[i]=s[i+1];
}
if (s[0]=='0'&&len==1)
{
printf("0\n");
continue; //第一次WA也没考虑0的情况
}
bigint basem,temp;
temp.init(0);
basem.init(1);
for (int i=len-1;i>=0;--i)
{
int d;
if (s[i]>='0'&&s[i]<='9')
d=s[i]-'0';
else
d=s[i]-'A'+10;
temp=temp+basem*d;
basem=basem*m;
}
int alen=0;
while (temp.size>1||temp.digit[0]!=0)
{
ans[alen++]=temp%n;
temp=temp/n;
}
if (flag==true) printf("-");
for (int i=alen-1;i>=0;--i)
{
if (ans[i]<10) printf("%d",ans[i]);
else printf("%c",ans[i]-10+'a');
}
printf("\n");
}
return 0;
}