美文网首页算法笔记学习笔记
《算法笔记》3.5小节——入门模拟->进制转换

《算法笔记》3.5小节——入门模拟->进制转换

作者: 木子李_0961 | 来源:发表于2020-04-04 22:44 被阅读0次

    @[TOC]
    CSDN链接:https://blog.csdn.net/qq_34767784/category_8813365.html

    Contest100000579 - 《算法笔记》3.5小节——入门模拟->进制转换

    例题

    PATB1022

    https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344
    题目:
    输入两个非负 10 进制整数 A 和 B (≤2
    ​30
    ​​ −1),输出 A+B 的 D (1<D≤10)进制数。

    输入格式:
    输入在一行中依次给出 3 个整数 A、B 和 D。

    输出格式:
    输出 A+B 的 D 进制数。

    输入样例:
    123 456 8

    输出样例:
    1103

    //1022 D进制的A+B
    题析:注意除基取余法应用,特别注意标注的倒叙输出从i-1开始
    以及循环用do…while(会出现arr[0]=0情况)
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    void dec2d(int num,int d)
    {
        int arr[50];int i=0;
        do
        {
            arr[i++]=num%d;
            num/=d;
        }while(num != 0);
        for(int j=i-1;j>=0;j--)//从i-1开始而不是i,因为arr[i]==0 
        {
            printf("%d",arr[j]);
        }
    }
    
    int main()
    {
        int a,b,d;
        while(scanf("%d%d%d",&a,&b,&d) != EOF)
        {
            int sum=a+b;
            dec2d(sum,d);
        }
        return 0;
    }
    
    

    Codeup练习题:

    http://codeup.cn/contest.php?cid=100000579

    1941 Problem A 又一版 A+B

    http://codeup.cn/problem.php?cid=100000579&pid=0

    题析:注意事项见注释,还是有坑的包括while(num)与while(num!=0)的区别还是不清楚
    
    //1941ProblemA又一版 A+B
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    void dec2m(long long num,int m)
    {
        int arr[31];
        int i=0;
        do
        {
            arr[i++]=num%m;
            num/=m;
        }while(num != 0);//此处大坑,while(num)显示错误50%?? 
        for(int j=i-1;j>=0;j--)//此处注意从i-1开始,因为最终一定是arr[i]==0, 
        {                   //因为是do...while(区别于while) ,因为有特殊情况(num==0)时 
            printf("%d",arr[j]);
        }
        
    }
    int main()
    {
        long long a,b;
        int m;
        while(scanf("%d%lld%lld",&m,&a,&b)!=EOF)
        {
            if(m==0)
                break;
            dec2m(a+b,m);
            printf("\n");
        }
        return 0;
    }
    
    
    

    1942 Problem B 数制转换

    http://codeup.cn/problem.php?cid=100000579&pid=1

    ASCII表
    题析:刚开始没弄清题意,后来参考大佬博客
    https://blog.csdn.net/privilage/article/details/79959279
    主要是字符的处理(将不同进制数作为字符数组,然后转换为10进制)+除基取余法转换的应用
    //1942ProblemB数制转换 
    #include<iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        long a,b;
        char num[100];
        char ans[100];
        long y=0;
        //把n进制转换成十进制 
        while(scanf("%ld%s%ld",&a, &num, &b) != EOF)
        {
            long sum=0;
            int len = strlen(num);
            //将a进制转换为10进制
            for(int i=0;i<len;i++)//转换,需熟悉ASCII表 
            {
                if(num[i]>='a')//小写字母转化为大写字母待后续处理
                {
                    num[i]=num[i]-32;   
                }   
                //int temp = (num[i] >= 'A'?num[i]-'A'+10:num[i]-'0');
                int temp;
                if(num[i]>='A')
                {
                    temp = num[i]-'A'+10;
                }
                else
                {
                    temp = num[i]-'0';
                }
                sum = sum*a + temp; 
            } 
            //将10进制转换为b进制,除基取余法
             int count=0;
             do
             {
                if(sum%b<=9)
                {
                    ans[count++] = sum%b+'0';
                }
                else
                {
                    ans[count++] = sum%b+'A'-10;
                }
                sum/=b;
             }while(sum != 0);
             //倒叙输出
             for(int j=count-1;j>=0;j--)
             {
                printf("%c",ans[j]);    
             } 
             printf("\n");
        }   
        return 0;
    }
    
    
    

    1943 Problem C 进制转换

    http://codeup.cn/problem.php?cid=100000579&pid=2

    
    
    题析:此题经典,见大神解析
    https://blog.csdn.net/ActionBeam/article/details/88355452
    
    //1943ProblemC进制转换
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    char mod(char num[])//辗转相除法求每一个余数 
    {
        int len = strlen(num);
        int rem=0,div=0;
        for(int i=0;i<len;i++)//注意余数为1时要乘以10保留到下一位作为被除数 
        {
            div = ((num[i]-'0')+rem*10) / 2;
            rem = ((num[i]-'0')+rem*10) % 2;
            num[i] = div + '0';//将每一位对应的商放回数组对应的位上
        }
        return rem+'0';//余数转换为字符返回 
    }
    
    bool isEmpty(char num[])//判断辗转相除法结束标志 ,即是否待转换数数组全0 
    {
        int len=strlen(num);
        for(int i=0;i<len;i++)
        {
            if(num[i]!='0')//注意为字符‘0’ 
            {
                return 0;   
            }   
        }   
        return 1;
    } 
    
    char numDec[35];
    char numBin[205]; 
    int main()
    {
        while(scanf("%s",numDec) != EOF)
        {
            int count=0;
            int len=strlen(numDec);
            do
            {
                numBin[count++]=mod(numDec);
            //  cout<<"dadad"<<endl;
            }while(!isEmpty(numDec));
            numBin[count]='\0';
            for(int i=count-1;i>=0;i--)//除基取余法的倒叙输出 
            {
                printf("%c",numBin[i]);
            }
            printf("\n");
            
        }
        return 0;
    }
    
    
    

    1944 Problem D 八进制

    http://codeup.cn/problem.php?cid=100000579&pid=3

    题析:题目简单,运用经典的除基取余法即可
    
    //1944ProblemD八进制 
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int octal[105];
    int main()
    {
        int N;
        while(scanf("%d",&N) != EOF)
        {
            int count=0;
            do
            {
                octal[count++]=N%8;
                N/=8;
            }while(N != 0);
            for(int j=count-1;j>=0;j--)
            {
                printf("%d",octal[j]);
            }
            printf("\n");
        }
        return 0;
    }
    
    
    

    相关文章

      网友评论

        本文标题:《算法笔记》3.5小节——入门模拟->进制转换

        本文链接:https://www.haomeiwen.com/subject/sicephtx.html