2013 年4月14号校赛B题 进制转化问题

进制转换问题

Time Limit: 1000MS

Description

大家都知道,计算机中是以二进制存储的!但是在现实生活中,我们遇到过各种各样的进制情况,我们接触得最多的就是十进制,不过,生活中还存在各种进制计数的情况。例如:一个星期七天是7进制、一年十二个月,是12进制等等。小明最近在学c语言,熟悉了c语言中的各种进制转换问题,所以就尝试着各种进制转换的程序,现在他想写一个程序,把一个无符号数n,转化成在b进制下的表示。例如:n10b2,则转化后为1010。又如:n10b16,则转化后为0XA. 

Input

输入的第一行为一个正整数t ( t<=10000 ),表示一共有t组测试数据。每组两个整数,分别为nb0 <= n <= 1000000000,2<=b<=16)n表示要转化的数,b表示b进制。

Output

输出nb进制下的表示。(注意:如b16输入时记得加上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;
    
}






你可能感兴趣的:(算法)