好贷网好贷款

九度OJ 1080 进制转换

发布时间:2016-12-3 17:42:22 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"九度OJ 1080 进制转换",主要涉及到九度OJ 1080 进制转换方面的内容,对于九度OJ 1080 进制转换感兴趣的同学可以参考一下。

题目描述: 将M进制的数X转换为N进制的数输出。 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36)。 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。 输出: 输出X的N进制表示的数。 样例输入: 16 10 F 样例输出: 15 提示: 输入时字母部分为大写,输出时为小写,并且有大数据。 /*********************************************** 输入数据前有可能有前缀0,比如0000087654321 另外也要注意对0的处理 *************************************************/ #include <stdio.h> #include <string.h> struct bigInt { int digit[300]; int size; }; void init(bigInt &a) { for(int i = 0; i < 300; i++) a.digit[i] = 0; a.size = 0; } bigInt add(bigInt a, bigInt b) //高精度整数加法 { bigInt ret; init(ret); int bound = a.size > b.size ? a.size : b.size; int carry = 0; for(int i = 0; i < bound; i++) { int tmp = a.digit[i] + b.digit[i] + carry; carry = tmp / 10000; ret.digit[ret.size++] = tmp % 10000; } if(carry != 0) ret.digit[ret.size++] = carry; return ret; } bigInt mul(bigInt a, int x) // 高精度整数乘小整数 { bigInt ret; init(ret); int carry = 0; for(int i = 0; i < a.size; i++) { int tmp = a.digit[i] * x + carry; ret.digit[ret.size++] = tmp % 10000; carry = tmp / 10000; } if(carry != 0) ret.digit[ret.size++] = carry; return ret; } bigInt divide(bigInt a, int x) // 高精度整数除以小整数 { bigInt ret; init(ret); int remainder = 0; for(int i = a.size - 1; i >= 0; i--) { int tmp = a.digit[i] + remainder * 10000; ret.digit[i] = tmp / x; remainder = tmp % x; } ret.size = 0; for(int j = 0; j < 300; j++) if(ret.digit[j] != 0) ret.size = j; ret.size++; return ret; } int mod(bigInt a, int x) // 高精度整数对小整数取模 { int remainder = 0; for(int i = a.size - 1; i >= 0; i--) { int tmp = a.digit[i] + remainder * 10000; remainder = tmp % x; } return remainder; } int main() { int M, N; while(scanf("%d%d",&M,&N) != EOF) { char buf[10000], res[10000]; int top = 0; scanf("%s",buf); struct bigInt a, b, mid; init(a); init(b); init(mid); mid.digit[0] = 1; mid.size = 1; int len = strlen(buf); int i, tmp, min = 0; while(buf[min] == '0') min++; for(i = len-1; i >= min; i--) // M进制数转为十进制高精度整数 { if(buf[i] >= '0' && buf[i] <= '9') tmp = buf[i] - '0'; else tmp = buf[i] - 'A' + 10; b = mul(mid,tmp); a = add(a,b); mid = mul(mid,M); } if(a.digit[a.size-1] == 0) // 十进制高精度整数转为N进制字符串 printf("0"); else { int ans; while(a.digit[a.size-1] != 0) { ans = mod(a,N); if(ans >= 0 && ans <= 9) res[top++] = '0' + ans; else res[top++] = 'a' + ans - 10; a = divide(a,N); //printf("%c\n",res[top-1]); } for(i = top - 1; i >= 0; i--) printf("%c",res[i]); } printf("\n"); } return 0; }

上一篇:单选按钮的动态选中
下一篇:Highchart导出列表的控制

相关文章

相关评论