进制转换---由任意进制转为任意进制---NOJ1592
2016-04-20 20:16
429 查看
题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1592
这个题完全是考验基本功的/(ㄒoㄒ)/~~
首先将之前进制数转为10进制,再将10进制数转为之后进制数。
由于涉及字母的问题,所以也不是那么容易处理的。
这里给出两种方法把,首先是常规做法,然后是stack做法。
常规做法:
stack做法主要处理的是10进制转任意进制的情况,利用stack先进后出的特性,每次把余数都压进去,最后输出时从最底层开始弹出,这样实现了自底而上的过程。
代码如下:
仅代表个人观点,欢迎探讨交流,勿喷~
PhotoBy:WLOP
http://weibo.com/wlop
这个题完全是考验基本功的/(ㄒoㄒ)/~~
首先将之前进制数转为10进制,再将10进制数转为之后进制数。
由于涉及字母的问题,所以也不是那么容易处理的。
这里给出两种方法把,首先是常规做法,然后是stack做法。
常规做法:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char bNum[300];//储存最后的进制数 int a[300]; int be,la; long toTen(char a[], int bit) //任意进制转10进制 { int length = strlen(a); int i,b=1; long sum=0; for(i=length-1;i>=0;i-- ) { if(a[i]>='A') { sum += (a[i]-'A'+10) *b; b *= bit; } else { sum += (a[i]-'0') *b; b *= bit; } } return sum; } void TentoOther(long num,int la) //10进制数转任意进制数 { int yushu,i=0; while(num>0) { yushu=num%la; a[i++]=yushu; num=num/la; } for(int j=i-1;j>=0;j--) { if(a[j]>=10) bNum[j]=a[j]-10+65; else bNum[j]=a[j]+48;//48是‘0’的ASCLL码值 } return ; } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int T; cin>>T; int q=0; while(T--) { char str[30]; memset(str,0,sizeof(str)); memset(bNum,0,sizeof(bNum)); memset(a,0,sizeof(a)); q++; scanf("%s",str); scanf("%d%d",&be,&la); if(str[0]=='0')//特判0的情况,在这里WA好多发/(ㄒoㄒ)/~~ { printf("Case %d: ",q); cout<<0; printf("(%d):",be); cout<<0; printf("(%d)",la); cout<<endl; continue; } int l=strlen(str); long ten=toTen(str,be); TentoOther(ten,la); int l1=strlen(bNum); printf("Case %d: ",q); for(int i=0;i<l;i++) cout<<str[i]; printf("(%d):",be); for(int i=l1-1;i>=0;i--)//记得倒着输出 cout<<bNum[i]; printf("(%d)",la); cout<<endl; } return 0; }
stack做法主要处理的是10进制转任意进制的情况,利用stack先进后出的特性,每次把余数都压进去,最后输出时从最底层开始弹出,这样实现了自底而上的过程。
代码如下:
#include <cstdio> #include <iostream> #include <cstring> #include <stack> using namespace std; int before, after,t, kase = 0; char s[40]; const char map[36]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; stack<char> ans; int main(int argc, char const *argv[]) { scanf("%d", &t); while(t--) { scanf("%s%d%d", s, &before, &after); int len = strlen(s); int flag = 1, sum = 0;//sum是任意进制转为10进制 for(int i = len-1; i >=0; i--) { if(s[i] >= 'A') sum +=((10+ s[i] - 'A') *flag) ; else sum += (s[i] - '0')*flag; flag *= before; } int a; ans.push(map[sum%after]);//不用特判0了; while(sum/=after) { a=sum%after; ans.push(map[a]);//记录每次余数对应的值压入stack中 } printf("Case %d: ", ++kase); printf("%s(%d):", s, before); while(!ans.empty()) { printf("%c",ans.top()); ans.pop(); } printf("(%d)\n",after); } return 0; }
仅代表个人观点,欢迎探讨交流,勿喷~
PhotoBy:WLOP
http://weibo.com/wlop
相关文章推荐
- SVN常见错误
- python中函数的总结之三
- python中函数的总结之三
- C#线程同步的几种方法
- 关于EnumerateObjectsUsingBlock和for-in之间的较量
- 内存管理
- Visual studio 2010出现“error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”解决方式
- python中函数的总结之三
- HDU 1808(鸽巢原理)
- iOS证书是怎么回事?
- 2016阿里巴巴测试开发实习笔试题
- 关于编程的人心与套路
- HDU 3032 Nim or not Nim?(博弈 SG打表找规律)
- android面试
- 给Button添加边框
- Codeforces Beta Round #9 (Div. 2 Only) C. Hexadecimal's Numbers dfs
- 单例模式的创建(Java版)
- 2016西电校赛网络赛 Problem F 方格填数
- RedHat Enterprise Linux6.4 使用CentOS yum源
- F. Set the memory