题目62:进制转换

来源:互联网 发布:数据恢复实验报告 编辑:程序博客网 时间:2024/06/06 02:34

http://ac.jobdu.com/problem.php?cid=1040&pid=61

题目描述:

将M进制的数X转换为N进制的数输出。

输入:

输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。

输出:

输出X的N进制表示的数。

样例输入:
16 10F
样例输出:
15
提示:

输入时字母部分为大写,输出时为小写,并且有大数据。

// 题目62:进制转换.cpp: 主项目文件。#include "stdafx.h"#include <stdio.h>#include <string.h>const int N=4003;char str[N];//输入字符串int start[N],ans[N],res[N]; //被除数,商,余数//转换前后的进制int oldBase;int newBase;void change(){//各个数位还原为数字形式int i,len = strlen(str);start[0] = len;for(i=1;i<= len;i++){if(str[i-1] >= '0' && str[i-1] <= '9'){start[i] = str[i-1] - '0';}if(str[i-1] >= 'A' && str[i-1] <= 'Z'){start[i] = str[i-1] - 'A' + 10;}} }void solve(){memset(res,0,sizeof(res));//余数初始化为空int y,i,j;//模n取余法,(总体规律是先余为低位,后余为高位)while(start[0] >= 1){//只要被除数仍然大于等于1,那就继续“模2取余”y=0;i=1;ans[0]=start[0];//while(i <= start[0]){y = y * oldBase + start[i];ans[i++] = y/newBase;y %= newBase; }res[++res[0]] = y;//这一轮运算得到的余数i = 1;//找到下一轮商的起始处while((i<=ans[0]) && (ans[i]==0)) i++;//清除这一轮使用的被除数memset(start,0,sizeof(start));//本轮得到的商变为下一轮的被除数for(j = i;j <= ans[0];j++)start[++start[0]] = ans[j]; memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备} }void output(){//从高位到低位逆序输出int i;for(i = res[0];i >= 1;--i){  if(res[i]<10)printf("%d",res[i]);elseprintf("%c",res[i] - 10 + 'a');}printf("\n"); }void reverse(){for(int i = 1,j = 0;i <= res[0];i++,j++)str[j] = res[i]+'0';str[ res[0] ] = '\0';}int main(){while(scanf("%s",str)!=EOF){oldBase=10,newBase=2;change();solve();reverse();oldBase=2,newBase=10;change();solve();output();}return 0;}


原创粉丝点击