南邮 OJ 1504 进制转换

来源:互联网 发布:java异常处理关键字 编辑:程序博客网 时间:2024/06/05 14:31

进制转换

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65535 KByte
总提交 : 112            测试通过 : 29 

比赛描述

Openxxx发现,我们所熟知十进制、二进制、十六进制都是一类很特殊的进制,其实进制有着更一般的情况。Openxxx发明了一种进制表示的通项公式:K~(a1,a2,……,ak-1,ak), 其中K代表进制的循环节长度,向量 (a1,a2,……,ak-1,ak) 是对循环节的描述。比如我们所熟知的十进制,二进制,十六进制可依次表示为 1~(10),1~(2)和1~(16),他们都属于循环节长度为1的进制。如果长度大于1会怎么样?不妨让我们观察一下进制2~(10,2)从0开始计数的情况:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,100?

为什么不是20呢?因为在此进制下第2位的位权是2,所以第2位上应该逢2进1。第3位呢?我们可以循环利用前面的位权,第3位就和第1位一样逢10进1,第4位就和第2位一样逢2进1,如此循环下去……

现在的问题是:给你两种不同的进制,请将原进制下的数转换成目标进制下的数。为了方便数的表达,我们用大写字母’A’~’Z’来代替10~35。



输入

多组测试数据,每组数据第1行输入两个正整数K1、K2,分别描述原进制和目标进制的循环节长度;第2行输入一串长度不超过30的字串(仅由 ’0’~’9’ 和’A’~’Z’ 构成),即原进制下的数。数据保证是合法的;第3行输入K1个正整数a1 ,…,ak1,第4行输入K2个正整数b1,…,bk2,分别描述原进制和目标进制的循环节。(1≤K1, K2≤10;2≤所有a, b≤36;0≤待转换的数≤2^30) 输入直至文件结尾。

输出

每组数据输出仅一行:转换后的目标数。

样例输入

1 1
8
10
2
2 2
ABC
16 15
14 13

样例输出

1000
102C

提示

 

题目来源

openxxx




/* Wrong Answer at Test 1#include<iostream>#define N 32int ow[N];//original weight原操作数对应的权重int on[N];//original number原操作数int tw[N];//target weight目的操作数对位的权重int tn[N];//target number目的操作数char temp[N];//存放接收到的数据int tempW[N];//每一位的权重//字符转化为数字,c[0]表示最高位,n[0]表示个位void charToNum(char *c,int *n,int len){int i;for(i=0;i<len;i++){if(c[i]>='0' && c[i]<='9'){n[len-1-i] = c[i]-'0';}else{n[len-1-i] = c[i]-'A'+10;}}}void numToChar(int *n,char *c,int len){int i;for(i=0;i<len;i++){if(n[i]<10){c[len-1-i] = n[i]+'0';}else{c[len-1-i] = n[i]-10+'A';}}c[len] = 0;}int main(){//freopen("test.txt","r",stdin);int K1,K2,i,oLen,tLen,r;while(scanf("%d%d",&K1,&K2)==2){scanf("%s",temp);oLen = strlen(temp);//原操作数的长度charToNum(temp,on,oLen);for(i=0;i<K1;i++){scanf("%d",&tempW[i]);}ow[0] = 1;for(i=1;i<N;i++){//会溢出,先不管ow[i] = ow[i-1]*tempW[(i-1)%K1];}//for(i=0;i<N;i++){//printf("%d\n",ow[i]);//}for(i=0;i<K2;i++){scanf("%d",&tempW[i]);}tw[0] = 1;for(i=1;i<N;i++){tw[i] = tw[i-1]*tempW[(i-1)%K2];}//for(i=0;i<N;i++){//printf("%d\n",tw[i]);//}r = 0;for(i=0;i<oLen;i++){r += on[i]*ow[i];}if(r==0){printf("0\n");}for(tLen=0;r>=tw[tLen];tLen++);tLen;for(i=tLen-1;i>=0;i--){tn[i] = r/tw[i];r %= tw[i];}numToChar(tn,temp,tLen);printf("%s\n",temp);}}*//* Presentation Error at Test 1#include<iostream>#define N 40__int64 ow[N];//original weight原操作数对应的权重__int64 on[N];//original number原操作数__int64 tw[N];//target weight目的操作数对位的权重__int64 tn[N];//target number目的操作数char temp[N];//存放接收到的数据__int64 tempW[N];//每一位的权重//字符转化为数字,c[0]表示最高位,n[0]表示个位void charToNum(char *c,__int64 *n,__int64 len){__int64 i;for(i=0;i<len;i++){if(c[i]>='0' && c[i]<='9'){n[len-1-i] = c[i]-'0';}else{n[len-1-i] = c[i]-'A'+10;}}}void numToChar(__int64 *n,char *c,__int64 len){__int64 i;for(i=0;i<len;i++){if(n[i]<10){c[len-1-i] = n[i]+'0';}else{c[len-1-i] = n[i]-10+'A';}}c[len] = 0;}int main(){//freopen("test.txt","r",stdin);__int64 K1,K2,i,oLen,tLen,r;while(scanf("%I64d%I64d",&K1,&K2)==2){scanf("%s",temp);oLen = strlen(temp);//原操作数的长度charToNum(temp,on,oLen);for(i=0;i<K1;i++){scanf("%I64d",&tempW[i]);}ow[0] = 1;for(i=1;i<N;i++){//会溢出,先不管ow[i] = ow[i-1]*tempW[(i-1)%K1];}//for(i=0;i<N;i++){//printf("%d\n",ow[i]);//}for(i=0;i<K2;i++){scanf("%I64d",&tempW[i]);}tw[0] = 1;for(i=1;i<N;i++){tw[i] = tw[i-1]*tempW[(i-1)%K2];}//for(i=0;i<N;i++){//printf("%d\n",tw[i]);//}r = 0;for(i=0;i<oLen;i++){r += on[i]*ow[i];}if(r==0){printf("0\n");}for(tLen=0;r>=tw[tLen];tLen++);tLen;for(i=tLen-1;i>=0;i--){tn[i] = r/tw[i];r %= tw[i];}numToChar(tn,temp,tLen);printf("%s\n",temp);}}*/#include<iostream>#define N 40__int64 ow[N];//original weight原操作数对应的权重__int64 on[N];//original number原操作数__int64 tw[N];//target weight目的操作数对位的权重__int64 tn[N];//target number目的操作数char temp[N];//存放接收到的数据__int64 tempW[N];//每一位的权重//字符转化为数字,c[0]表示最高位,n[0]表示个位void charToNum(char *c,__int64 *n,__int64 len){__int64 i;for(i=0;i<len;i++){if(c[i]>='0' && c[i]<='9'){n[len-1-i] = c[i]-'0';}else{n[len-1-i] = c[i]-'A'+10;}}}void numToChar(__int64 *n,char *c,__int64 len){__int64 i;for(i=0;i<len;i++){if(n[i]<10){c[len-1-i] = n[i]+'0';}else{c[len-1-i] = n[i]-10+'A';}}c[len] = 0;}int main(){//freopen("test.txt","r",stdin);__int64 K1,K2,i,oLen,tLen,r;while(scanf("%I64d%I64d",&K1,&K2)==2){scanf("%s",temp);oLen = strlen(temp);//原操作数的长度charToNum(temp,on,oLen);for(i=0;i<K1;i++){scanf("%I64d",&tempW[i]);}ow[0] = 1;for(i=1;i<N;i++){//会溢出,先不管ow[i] = ow[i-1]*tempW[(i-1)%K1];}//for(i=0;i<N;i++){//printf("%d\n",ow[i]);//}for(i=0;i<K2;i++){scanf("%I64d",&tempW[i]);}tw[0] = 1;for(i=1;i<N;i++){tw[i] = tw[i-1]*tempW[(i-1)%K2];}//for(i=0;i<N;i++){//printf("%d\n",tw[i]);//}r = 0;for(i=0;i<oLen;i++){r += on[i]*ow[i];}if(r==0){printf("0\n");continue;//PE1}for(tLen=0;r>=tw[tLen];tLen++);tLen;for(i=tLen-1;i>=0;i--){tn[i] = r/tw[i];r %= tw[i];}numToChar(tn,temp,tLen);printf("%s\n",temp);}}



0 0