机试算法讲解:第31题 大整数的M进制转N进制
来源:互联网 发布:快速排序 java 编辑:程序博客网 时间:2024/06/07 03:15
/*将M进制的数X转换为N进制的数输出,2<=M,N<=36,输入时字母部分为大写,输出时为小写,并且有大数据输入:16(M进制) 10(N进制)F(待转换的数)输出:15*/#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct BigInterger{int _digit[1000];int _size;void init();void set(int x);//重载的返回值仍然是大数BigInterger operator + (const BigInterger& x) const;BigInterger operator * (int x) const;BigInterger operator / (int x) const;int operator % (int x) const;void output();}BigInterger;void BigInterger::init(){for(int i = 0 ; i < 1000 ; i++){_digit[i] = 0;}_size = 0;}void BigInterger::set(int x){//易错,set之前一定要初始化init();do{_digit[_size++] = x%10000;//保存余数作为低位x /= 10000;//留下低位}while(x!=0);}BigInterger BigInterger::operator * (int x) const{BigInterger ret;ret.init();int iPass = 0;//默认进位是从0开始//重载乘法,应该是从低位到高位乘for(int i = 0 ; i < _size ; i++){int iSum = x*_digit[i] + iPass;ret._digit[ret._size++] = iSum % 10000;//记录乘积iPass = iSum / 10000;//获取进位iSum %= 10000;//获取余数}//如果最后的高位需要进位,则进位if(0!=iPass){ret._digit[ret._size++] = iPass;}return ret;}BigInterger BigInterger::operator + (const BigInterger& x) const{//两个大数相加,应该从低位开始BigInterger ret;ret.init();int iPass = 0;for(int i = 0 ; i < _size ; i++){int iSum = _digit[i] + x._digit[i] + iPass;ret._digit[ret._size++] = iSum % 10000;iPass = iSum / 10000;//iSum /= 10000;}//最后高位需要进位if(0!=iPass){ret._digit[ret._size++] = iPass;}return ret;}#define MaxSize 100BigInterger BigInterger::operator / (int x) const{//大数相除,应该从高位开始BigInterger ret;ret.init();int iRemainder = 0 ; //设置除数为0for(int i = _size - 1 ; i >= 0 ; i--){//设置除数是上一趟的余数加上这一趟的本数int iShang = (10000*iRemainder + _digit[i]) / x;//求商int iYu = (10000*iRemainder + _digit[i]) % x;//求余数//ret._digit[ret._size] = iShang;//易错,保存本位的值,利用ret._digir[i] = iShang;ret._digit[i] = iShang;//易错,更新余数为本次求出的余数//iRemainder /= 10000;iRemainder = iYu;}//易错,需要设置,最高有效位的上一位为未使用过的那一位ret._size = 0;for(int j = 0 ; j < MaxSize ; j++){if(ret._digit[j]!=0){//ret._size = i;ret._size = j;}}ret._size++;//一定要返回那个值return ret;}int BigInterger::operator % (int x) const{int iRemainder = 0 ; for(int i = _size - 1 ; i >= 0 ; i--){int iShang = (iRemainder*10000 + _digit[i]) / x;int iYu = (iRemainder*10000 + _digit[i]) % x;iRemainder = iYu;}return iRemainder;}void BigInterger::output(){//输出时,应该从低到高输出bool isFirst = true;for(int i = _size - 1 ; i >= 0 ; i--){if(i!=_size-1){printf("%04d",_digit[i]);}else{printf("%d",_digit[i]);}}printf("\n");}int main(int argc,char* argv[]){char str[10000];char ans[10000];//存放分解后的结果int m,n;while(EOF!=scanf("%d %d",&m,&n)){BigInterger a,b;scanf("%s",str);//待转换的数int iSize = strlen(str);a.set(0);//a的初始值设为0,用来保存十进制的m进制数b.set(1);//m->10进制,代表每一位的权重//m->10进制 for(int k = iSize - 1 ; k >=0 ; k--){int t;if(str[k] <= '9' && str[k] >= '0'){t = str[k] - '0';}else{t = str[k] - 'A' + 10;}a = a + b*t;//a.output();b = b*m;//更新权重}int iCount = 0;//代表转换为n进制后的字符个数//10->n进制do{int iYu = a%n;//求余数if(iYu > 10){ans[iCount++] = iYu - 10 + 'a';}else{ans[iCount++] = iYu + '0';}a = a/n;//求商}while(a._digit[0]!=0 || a._size!=1);for(int j = iCount - 1 ; j>= 0 ;j--){printf("%c",ans[j]);}printf("\n");}system("pause");getchar();return 0;}
0 0
- 机试算法讲解:第31题 大整数的M进制转N进制
- 机试算法讲解: 第6题 给n个整数,按从大到小的顺序,输出前m大的整数
- 大整数的m进制转n进制
- 机试算法讲解:第30题 大整数的阶乘
- 机试算法讲解:第29题 我也能做高精度整数的加法器,噢耶
- 整数划分n>m情况讲解
- 计算n位m进制所有整数的算法
- 找到整数数组中第m大的数
- 机试算法讲解:第47题 递推之N阶楼梯如何上楼
- 求一个整数数组中第N大的数
- 求m和n的算法题
- 机试算法讲解: 第5题 读入N名学生的成绩,将获得某一给定分数的学生人数输出
- 产生[n,m]之间的随机整数
- HDU 3388 与m,n 互质的第k个整数
- 每日一道算法题:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 生成0~n-1内的m个随机整数的四种算法
- 大整数的N次幂对某个整数求余算法
- 求杨辉三角第n行的第m个数算法的深入研究
- 机试算法讲解:第30题 大整数的阶乘
- 2.1 选区的基本操作
- CSS的布局
- C语言播放MP3音乐
- extjs类继承图之组件(1)
- 机试算法讲解:第31题 大整数的M进制转N进制
- 链式队列
- Android Fragment 真正的完全解析(下)
- 机试算法讲解:第32题 并查集是个好东西
- css页面布局基础盒模型
- 11_Eclipse中演示Git版本的创建,历史版本的修改,创建分支,合并历史版本和当前版本
- Problem<c>( Link-cut tree )
- PHP中global关键字和$GLOBALS用法
- 机试算法讲解: 第33题 并查集之找小伙伴