poj1220
2016-07-27 21:57
204 查看
Problem : NUMBER BASE CONVERSION
Description: 用0-9,A-Z,a-z这62个不同的数字和字母来表示不同进制的数,给出一个任意进制(62以内)的数,要求转换为指定进制的数。
Solution:刚开始看到这个我是想先把给出的数化成十进制,然后再由十进制转化为指定的进制,结果发现太麻烦了,我也觉得我实现不了。后来上百度才发现可以用除法解决。在这里为了方便,我举一个比较简单的例子。把十进制的12化成二进制表示,首先用1除以2,得到商是0,余数是1,然后用1乘以10(这里因为是十进制所以乘十)再加上2(12的个位数2),得到商为6,余数为0,这时候的余数存进另一个数组ans,因为这个余数就是我们要转化的二进制需要的那个余数。这时候06就存在了之前的那个存12的数组num里,我在这里有去掉前边多余的零;然后把6再去除以2,得到商为3,余数为0,把此时的余数存进ans数组;这时候num数组里是3,用3除以2,商为1,余数为1(余数1存进ans数组,商1存进num数组);最后用1除以2,商为0,余数为1;这时候num数组只有一个数而且为0,所以不用接着算了。这时候ans数组里为0011,倒序输出就得到了12的二进制了。
Code(C++):
Description: 用0-9,A-Z,a-z这62个不同的数字和字母来表示不同进制的数,给出一个任意进制(62以内)的数,要求转换为指定进制的数。
Solution:刚开始看到这个我是想先把给出的数化成十进制,然后再由十进制转化为指定的进制,结果发现太麻烦了,我也觉得我实现不了。后来上百度才发现可以用除法解决。在这里为了方便,我举一个比较简单的例子。把十进制的12化成二进制表示,首先用1除以2,得到商是0,余数是1,然后用1乘以10(这里因为是十进制所以乘十)再加上2(12的个位数2),得到商为6,余数为0,这时候的余数存进另一个数组ans,因为这个余数就是我们要转化的二进制需要的那个余数。这时候06就存在了之前的那个存12的数组num里,我在这里有去掉前边多余的零;然后把6再去除以2,得到商为3,余数为0,把此时的余数存进ans数组;这时候num数组里是3,用3除以2,商为1,余数为1(余数1存进ans数组,商1存进num数组);最后用1除以2,商为0,余数为1;这时候num数组只有一个数而且为0,所以不用接着算了。这时候ans数组里为0011,倒序输出就得到了12的二进制了。
Code(C++):
#include <iostream> #include <string> #include <cstring> using namespace std; int num[1000]; int ans[1000]; int main() { int N,length,r,t; int m,n,i,j,pos,s; string str; cin>>N; while(N--) { cin>>m>>n>>str; length=str.size(); t=0,s=1; for(i=0; i<length; i++) { if(str.at(i)>='0'&&str.at(i)<='9') num[i]=str.at(i)-'0'; else if(str.at(i)>='A'&&str.at(i)<='Z') num[i]=str.at(i)-'A'+10; else if(str.at(i)>='a'&&str.at(i)<='z') num[i]=str.at(i)-'a'+36; } memset(ans,0,sizeof(ans)); while(!(s==0)) { r=0; pos=0; for(j=0; j<length; j++) { int temp=num[j]; num[pos++]=(r*m+temp)/n; r=(r*m+temp)%n; } ans[t++]=r; for(i=0;i<pos;i++) if(num[i]!=0) break; s=0; for(;i<pos;i++) num[s++]=num[i]; length=s; } cout<<m<<" "<<str<<endl; cout<<n<<" "; for(i=t-1; i>=0; i--) { if(ans[i]>=0&&ans[i]<=9) cout<<char(ans[i]+'0'); else if(ans[i]>=10&&ans[i]<=35) cout<<char(ans[i]+'A'-10); else if(ans[i]>=36&&ans[i]<=61) cout<<char(ans[i]+'a'-36); } cout<<endl; cout<<endl; } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- [数论]poj2635__The Embarrassed Cryptographer
- [二分图匹配]poj2446__Chessboard
- POJ1050 最大子矩阵和
- 用单调栈解决最大连续矩形面积问题