B 进制转换问题
Time Limit: 1000MS
Description:
大家都知道,计算机中是以二进制存储的!但是在现实生活中,我们遇到过各种各样的进制情况,我们接触得最多的就是十进制,不过,生活中还存在各种进制计数的情况。例如:一个星期七天是7进制、一年十二个月,是12进制等等。小明最近在学c语言,熟悉了c语言中的各种进制转换问题,所以就尝试着各种进制转换的程序,现在他想写一个程序,把一个无符号数n,转化成在b进制下的表示。例如:n为10,b为2,则转化后为1010。又如:n为10,b为16,则转化后为0XA.
Input:
输入的第一行为一个正整数t ( t<=10000 ),表示一共有t组测试数据。每组两个整数,分别为n,b(0 <= n <= 1000000000,2<=b<=16)。n表示要转化的数,b表示b进制。
Output:
输出n在b进制下的表示。(注意:如b为16输入时记得加上0X,字母都是以大写的形式
Sample Input
4
10 2
10 16
100 7
1000000000 16
Sample Output
1010
0XA
202
0X3B9ACA00
直接套用神书上的模板,半夜起来不放心 自己再码一遍加深印象 这个进制转化可以转化 1-36 位的进制转化为 1-36进制的数;
用的是大写字母表示的~~
post code:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
string transform(int m,int n,string s){ //1-36 进制任意转化 还包括负数的情况
int sum=0;
string res="";
for(int i=0;i<s.length();i++){
if(s[i]=='-')continue;
if( (s[i]<='9')&& (s[i]>='0'))sum=sum*m+s[i]-'0';
else sum=sum*m+s[i]-'A'+10;
}
char tmp;
while(sum){
tmp=sum%n;
sum=sum/n;
if(tmp<10)tmp=tmp+'0';
else tmp=tmp-10+'A';
res=tmp+res;
}
if(s[0]=='-')res='-'+res; //可以注意负数的情况
if( res.length()==0 ) res='0'; //0 要转化其他进制的情况
if(n==16)res="0X"+res; //题目要求 16进制要加 0X
return res;
}
int main()
{
int n,base;
string s;
scanf("%d",&n);
while(n--){
cin>>s>>base;
s=transform(10,base,s);
cout<<s<<endl;
}
return 0;
}