FJUT ACM 3271 我想回去读幼儿园
Problem Description
集训队最菜的卖女孩的小火柴最近遇到了一个大麻烦.
他读幼儿园的妹妹问了他一题问题:给出一个数n,接着给出两个数a,b(2<=a<=b<=35).
让你求出a进制的n数转化为a+1进制后的值在转化为a+2进制,然后在转化为a+3进制,直到转化为b进制为止.
大于9的数用大写的ABCD....表示.
数据保证进制每次转化后的数小于10^18.
他太菜了,所以不会,相信各位ACMER大佬们会帮他解答(这么水的题你不帮我写?).
Input
T组输入
接下来T行,每行一个a进制整数n,两个正整数a,b
(T<=500000,0<=n<=10^18)
Output
对每次输入,输出答案
SampleInput
3 11 10 12 BAD 15 20 111111 2 5
SampleOutput
B 6BI 223
【思路】:显而易见这是一题水题,但是这题水题坑死我了,就是一个进制转化,从n进制先转成10进制
再从10进制转到另一个进制,但是我就是wa了好几次,后来seventh大佬救了我一发,发现是因为char 数组
最后没有\0然后strlen不能使用,wa成sb!
贴上代码领个教训
#include<stdio.h> #include<string.h> #include<math.h> char ans[66]; char sums[66]; long long quick_pow(int a,int b) { long long ans=1; long long temp=a; while(b!=0) { if(b&1!=0) { ans=ans*temp; } temp=temp*temp; b>>=1; } return ans; } int main() { int t; while(~scanf("%d",&t)) { while(t--) { int a,b; long long sum=0; memset(ans,0,sizeof(ans)); memset(sums,0,sizeof(sums)); scanf("%s%d%d",ans,&a,&b); if(ans[0]=='0') { printf("0\n"); continue; } int len=strlen(ans); for(int i=len-1; i!=-1; i--) { if(ans[i]>='0'&&ans[i]<='9') sum+=(ans[i]-'0')*quick_pow(a,len-1-i); else if(ans[i]>='A'&&ans[i]<='Z') { sum+=(ans[i]-'A'+10)*quick_pow(a,len-1-i); } } int i=0; int s; while(sum!=0) { s=sum%b; sum=sum/b; if(s>=0&&s<=9) sums[i]=s+'0'; else sums[i]=s-10+'A'; i++; } sums[i]=0; int lens=strlen(sums); for(int i=lens-1; i!=-1; i--) { printf("%c",sums[i]); } printf("\n"); } } return 0; }