【算法练习】进制转换/《王道机试》 4道题

目录

进制转换

又一版A+B

百练POJ2710:数制转换

百练POJ3249 进制转换

八进制


 

进制转换

进制转换其实就是一种较为特殊的数位拆解。

问题:数字a从m进制转换成n进制

步骤:①从m进制转成十进制

        ②从十进制转成n进制

 

 

又一版A+B

题目链接:https://www.nowcoder.com/practice/9255c05d45b8406c9b588d7c57aa920b?tpId=40&tqId=21466&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

题目描述

输入两个不超过整型定义的非负10进制整数A和B(<=2^31-1),输出A+B的m (1 < m <10)进制数。

输入描述:

输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。

输出描述:

输出格式:每个测试用例的输出占一行,输出A+B的m进制数。

示例1

输入

8 1300 48
2 1 7
0

输出

2504
1000

AC代码:

#include
using namespace std;

int main(){
    int m;
    long long A,B,C;

    while(cin>>m){
        if(m==0) break;
        cin>>A>>B;
        C=A+B;
        //将C转换成m进制
        int ans[20],size=0;
        do{
            ans[size++]=C%m;
            C=C/m;
        }while(C!=0);

        for(int i=size-1;i>=0;i--){
            cout<

百练POJ2710:数制转换

题目链接:http://bailian.openjudge.cn/practice/2710/

2710:数制转换

总时间限制: 

1000ms

内存限制: 

65536kB

描述

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

输入

输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。
a,b是十进制整数,2 =< a,b <= 16。

输出

输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

样例输入

15 Aab3 7

样例输出

210306

AC代码:

#include
#include 
using namespace std;

int main(){
    int a,b;   //a进制转成b进制
    //输入可能有前导0
    char str[100];
    while(cin>>a>>str>>b){
        //先把a进制的转换成十进制
        int length=strlen(str);
        int ans1=0;  //10进制的
        int p=1;
        for(int i=length-1;i>=0;i--){
            int tmp;
            if(str[i]>='0' && str[i]<='9'){
                tmp=(str[i]-'0')*p;
                ans1+=tmp;
            }
            else if(str[i]>='a' && str[i]<='z'){
                tmp=(str[i]-'a'+10)*p;
                ans1+=tmp;
            }
            else if(str[i]>='A' && str[i]<='Z'){
                tmp=(str[i]-'A'+10)*p;
                ans1+=tmp;
            }
            p=p*a;
        }

        //十进制转成b进制
        int ans2[20],size=0;
        do{
            ans2[size++]=ans1%b;
            ans1=ans1/b;
        }while(ans1!=0);

        //倒序输出
        for(int i=size-1;i>=0;i--){
            if(ans2[i]>=10){
                char c=ans2[i]-10+'A';
                cout<

百练POJ3249 进制转换

题目链接:http://bailian.openjudge.cn/practice/3249/

3249:进制转换

总时间限制: 

1000ms

内存限制: 

65536kB

描述

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

输入

多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)

输出

每行输出对应的二进制数。

样例输入

0
1
3
8

样例输出

0
1
11	
1000

题目理解:这需要用到大整数除法,就是在除数不为0 的时候一直循环地计算相应位的余数,就像那个列竖式算除以2的余数一样

AC代码 ,注意考虑数组的大小 

10^30   大约 2^100次方左右 

#include
#include 
using namespace std;

char str[200];
int tmp[200];
int ans[200];  //最后余数
int main(){
    while(cin>>str){
        int len=strlen(str);
            for(int i=0;i=0;i--){
                cout<

 


八进制

题目链接:https://www.nowcoder.com/practice/eda051c1effc4dffa630bc8507f0c5f7?tpId=40&tqId=21562&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

 

题目描述

输入一个整数,将其转换成八进制数输出。

输入描述:

输入包括一个整数N(0<=N<=100000)。

输出描述:

可能有多组测试数据,对于每组数据,
输出N的八进制表示数。

示例1

输入

7
8
9

输出

7
10
11

题目理解:应该是一个非常简单的进制转换的问题,也没有大数的问题。

AC代码:

#include 
#include 
using namespace std;
int N;
int ans[50];
int num;
int main(){
    while (cin>>N) {
        //10进制转换成8进制
        num = 0;
        memset(ans, 0, sizeof(ans));

        do {
            ans[num++] = N % 8;
            N = N / 8;
        } while (N != 0);

        for (int i = num - 1; i >= 0; i--) {
            cout << ans[i];
        }
        cout << endl;
    }
    return 0;
}

 

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