Sample Input
8 62 2 abcdefghiz 10 16 1234567890123456789012345678901234567890 16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 35 23 333YMHOUE8JPLT7OX6K9FYCQ8A 23 49 946B9AA02MI37E3D3MMJ4G7BL2F05 49 61 1VbDkSIMJL3JjRgAdlUfcaWj 61 5 dl9MDSWqwHjDnToKcsWE1S 5 10 42104444441001414401221302402201233340311104212022133030
Sample Output
62 abcdefghiz 2 11011100000100010111110010010110011111001001100011010010001 10 1234567890123456789012345678901234567890 16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 35 333YMHOUE8JPLT7OX6K9FYCQ8A 35 333YMHOUE8JPLT7OX6K9FYCQ8A 23 946B9AA02MI37E3D3MMJ4G7BL2F05 23 946B9AA02MI37E3D3MMJ4G7BL2F05 49 1VbDkSIMJL3JjRgAdlUfcaWj 49 1VbDkSIMJL3JjRgAdlUfcaWj 61 dl9MDSWqwHjDnToKcsWE1S 61 dl9MDSWqwHjDnToKcsWE1S 5 42104444441001414401221302402201233340311104212022133030 5 42104444441001414401221302402201233340311104212022133030 10 1234567890123456789012345678901234567890
题目意思就是:在T组数据中,从进制m转化为进制n
#include<stdio.h>
#include<string.h>
int n,m;
char a[555],ans_str[555];
int c[555];
int ans_int[555];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%s",&n,&m,a);
//-----------------------------------------//
if(a[0]=='0'){
printf("%d %s\n%d 0\n\n",n,a,m);
continue;
}
//-----------------------------------------//
for(int i=0;i<strlen(a);i++){
if(a[i]>='A'&&a[i]<='Z')
c[i]=a[i]-'A'+10;
else if(a[i]>='a'&&a[i]<='z')
c[i]=a[i]-'a'+36;
else
c[i]=a[i]-'0';
}
//-----------------------------------------//
int pos=0;
while(pos<555)
{
int ans=0;
for(int i=0;i<strlen(a);i++){
ans=ans*n+c[i];
c[i]=ans/m;
ans=ans%m;
}
ans_int[pos++]=ans;
}
//-----------------------------------------//
memset(ans_str,'0',sizeof(ans_str[0]));
for(int j=0;j<pos;j++){
if(ans_int[j]>=10&&ans_int[j]<=35)
ans_str[pos-j-1]=ans_int[j]+'A'-10;
else if(ans_int[j]>=36&&ans_int[j]<=61)
ans_str[pos-j-1]=ans_int[j]+'a'-36;
else
ans_str[pos-j-1]=ans_int[j]+'0';
}
//-----------------------------------------//
printf("%d %s\n%d ",n,a,m);
int tag=1;
for(int i=0;i<pos;i++){
if(ans_str[i]=='0'&&tag)
continue;
if(ans_str[i]!='0')
tag=0;
printf("%c",ans_str[i]);
}
puts("\n");
//-----------------------------------------//
}
return 0;
}
代码中需要注意的是:
int pos=0;
while(pos<555)
{
int ans=0;
for(int i=0;i<strlen(a);i++){
ans=ans*n+c[i];
c[i]=ans/m;
ans=ans%m;
}
ans_int[pos++]=ans;
}
这里是同余求模定理
可以见我的另外的一片bloghttp://blog.csdn.net/summer__show_/article/details/50716283
题意:把一个int型的十进制的转化位一个-2进制的数
解析:
例如:
把 -6 进制的123数字转化为十进制的数
1 * (-6)*(-6)+2*(-6)+3
反之,将负进制转化位正进制
找到一个最小的非负整数 x 使得当前数减去x能被6 整除,这个x将被作为最新的最高位写到结果中
然后这个数减去x 除以 -6 ,循环做这两步即可
#include<stdio.h>
#include<string.h>
int main()
{
int a;
int ans[1005];
scanf("%d",&a);
if(a==0){
printf("0\n");
return 0;
}
memset(ans,0,sizeof(ans));
int i=0;
while(a)
{
ans[i]=a%2;
if(ans[i]<0)
ans[i]=-ans[i];
a-=ans[i];
a/=(-2);
i++;
}
for(int j=i-1;j>=0;j--)
printf("%d",ans[j]);
return 0;
}