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
#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; }