进制转换不必多说,反向取余与累加法,下面是模板代码
/*
进制转换模板
By:qpswwww(ZYK)
调用接口:Hugeint.scan()
*/
#define MAXN 1000 //数字长度
#define SYS 10
int M=2; //M为转换的进制数
char ch[]={"0123456789ABCDEF"};
int nToTen(Hugeint in) //n进制数in转十进制
{
int i,j,tot=0;
for(i=in.size;i>=1;i--)
{
tot*=M;
tot+=in.s[i];
}
return tot;
}
Hugeint TenTon(int in) //十进制数in转n进制
{
Hugeint out;
out.size=0;
out.sign=1;
while(in>0)
{
out.size++;
out.s[out.size]=in%M;
in/=M;
}
return out;
}
void scanN(Hugeint &out) //输入n进制数out
{
memset(out.s,0,sizeof(out.s));
int i=0,j;
char in[MAXN];
scanf("%s",in);
if(in[0]=='-') out.sign=-1,i++;
else if(in[0]=='0') out.sign=0;
else out.sign=1;
out.size=strlen(in)-i;
for(j=out.size;j>0;i++,j--)
{
if(in[i]>='A') out.s[j]=in[i]-'A'+10;
else out.s[j]=in[i]-'0';
}
}
void printN(Hugeint in) //输出n进制数in
{
int i;
if(in.sign==-1) printf("-");
else if(in.sign==0)
{
printf("0");
return;
}
for(i=in.size;i>=1;i--)
{
printf("%c",ch[in.s[i]]);
}
}
例题(Wikioi 1474):
题目描述 Description
将十进制数n转换成m进制数 m<=16
n<=100
输入描述 Input Description
共一行
n和m
输出描述 Output Description
共一个数
表示n的m进制
样例输入 Sample Input
样例1:10 2
样例2:100 15
样例输出 Sample Output
样例1:1010
样例2:6A
代码
/*
进制转换模板
By:qpswwww(ZYK)
调用接口:Hugeint.scan()
*/
#include <stdio.h>
#include <string.h>
#define MAXN 1000 //数字长度
#define SYS 10
int M=2; //M为转换的进制数
char ch[]={"0123456789ABCDEF"};
struct Hugeint //高精度
{
int s[MAXN];
int size; //数字大小
int sign; //符号,1为正,-1为负,0为零
Hugeint operator + (Hugeint b) //高精度加法
{
int i,j;
Hugeint out;
out.s[0]=0;
out.size=size;
if(b.size>size) out.size=b.size;
for(i=1;i<=out.size;i++) out.s[i]=s[i];
for(i=1;i<=out.size;i++)
out.s[i]+=b.s[i];
for(i=1;i<=size;i++)
{
if(out.s[i-1]/SYS>0)
out.s[i]+=out.s[i-1]/SYS;
out.s[i-1]%=SYS;
}
if(out.s[size]/SYS>0)
{
out.size++;
out.s[size]=out.s[size-1]/SYS;
out.s[size-1]%=SYS;
}
return out;
}
Hugeint operator*(Hugeint b) //高精度乘法
{
int i,j;
Hugeint out;
memset(out.s,0,sizeof(out.s));
out.sign=sign*b.sign;
for(i=1;i<=size;i++)
{
for(j=1;j<=b.size;j++)
{
out.s[i+j-1]+=(s[i]*b.s[j]);
}
}
for(i=1;i<MAXN;i++)
{
if(out.s[i-1]/SYS>0)
out.s[i]+=out.s[i-1]/SYS;
out.s[i-1]%=SYS;
}
for(i=MAXN-1;i>=1;i--)
if(out.s[i]) break;
out.size=i;
return out;
}
bool operator>(Hugeint b) //高精度大于
{
int i,j;
if(sign==b.sign&&sign==-1)
{
if(size<b.size) return 1;
for(i=size;i>=1;i--)
{
if(s[i]>b.s[i]) return 0;
if(s[i]<b.s[i]) return 1;
}
}
else
{
if(sign>b.sign) return 1;
if(size>b.size) return 1;
for(i=size;i>=1;i--)
{
if(s[i]>b.s[i]) return 1;
if(s[i]<b.s[i]) return 0;
}
}
return 0;
}
bool operator<(Hugeint b) //高精度小于
{
int i,j;
if(sign==b.sign&&sign==-1)
{
if(size<b.size) return 0;
for(i=size;i>=1;i--)
{
if(s[i]>b.s[i]) return 1;
if(s[i]<b.s[i]) return 0;
}
}
else
{
if(sign>b.sign) return 0;
if(size>b.size) return 0;
for(i=size;i>=1;i--)
{
if(s[i]>b.s[i]) return 0;
if(s[i]<b.s[i]) return 1;
}
}
return 0;
}
void print() //输出
{
int i,flag=0;
if(sign==-1) printf("-");
else if(sign==0)
{
printf("0");
return;
}
for(i=size;i>=1;i--)
{
if(flag) printf("%d",s[i]);
else if(s[i]) printf("%d",s[i]),flag=1;
}
}
void scan() //输入
{
memset(s,0,sizeof(s));
int i=0,j;
char in[MAXN];
scanf("%s",in);
if(in[0]=='-') sign=-1,i++;
else if(in[0]=='0') sign=0;
else sign=1;
size=strlen(in)-i;
for(j=size;j>0;i++,j--)
s[j]=in[i]-'0';
}
};
int nToTen(Hugeint in) //n进制数in转十进制
{
int i,j,tot=0;
for(i=in.size;i>=1;i--)
{
tot*=M;
tot+=in.s[i];
}
return tot;
}
Hugeint TenTon(int in) //十进制数in转n进制
{
Hugeint out;
out.size=0;
out.sign=1;
while(in>0)
{
out.size++;
out.s[out.size]=in%M;
in/=M;
}
return out;
}
void scanN(Hugeint &out) //输入n进制数out
{
memset(out.s,0,sizeof(out.s));
int i=0,j;
char in[MAXN];
scanf("%s",in);
if(in[0]=='-') out.sign=-1,i++;
else if(in[0]=='0') out.sign=0;
else out.sign=1;
out.size=strlen(in)-i;
for(j=out.size;j>0;i++,j--)
{
if(in[i]>='A') out.s[j]=in[i]-'A'+10;
else out.s[j]=in[i]-'0';
}
}
void printN(Hugeint in) //输出n进制数in
{
int i;
if(in.sign==-1) printf("-");
else if(in.sign==0)
{
printf("0");
return;
}
for(i=in.size;i>=1;i--)
{
printf("%c",ch[in.s[i]]);
}
}
int main()
{
int n;
Hugeint out;
scanf("%d%d",&n,&M);
out=TenTon(n);
printN(out);
printf("\n");
return 0;
}