zoukankan      html  css  js  c++  java
  • noi.openjudge 1.13.44

    http://noi.openjudge.cn/ch0113/44/

    总时间限制: 
    1000ms
    内存限制: 
    65536kB
    描述

    将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为[2,36],其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,...,Z,不考虑小写字母



    。 

    输入


    一共1+m 行: 
    第1行为 m,表示后面有 m 行(1 <= m <= 60). 
    其后的m行中,每行3个数: 进制p,p进制数n,以及进制 q。 
    三个数之间用逗号间隔。
    n 的长度不超过50位。输出转换后的 q 进制数。样例输入
    6
    18,2345678A123,18
    15,23456,18
    12,2345678,20
    16,12345678,23
    25,3456AB,21
    18,AB1234567,22
    样例输出
    2345678A123
    114E0
    22B7A4
    21A976L
    7C2136
    22JF0G367


    思路:

        对于这一题来说,肯定是要用到字符串来模拟计算的,但是你会发现事情没有那么简单,它不想大整数加法那样可以直接来进行计算,我能想到的就是现将其转换为10进制,再转换为其他进制,那么在这个时候,又要用到大整数的加法了,写起来并不是不可以,可是我觉得太麻烦了,于是这一题就一直放在这里,直到我看见一篇好文:浅谈大数进制转换

    这是AC代码:

    其实还有一个问题在我心中没有解决,那就是在进行一次除法运算之后,为什么这个数还是p进制的,它不是明明已经*p变为十进制的数了吗?


    #include<stdio.h>
    #include<string.h>
    char c[200];
    int s[200];
    int a,b;
    int ans[200];
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%s",c);
            int l=strlen(c);
            b=a=0;
            int t;
            int y=0;
            for(t=0;t<l;t++){
                if(c[t]==','){break;}
                a=a*10+c[t]-48;
            }
            for(t++;t<l;t++){
                if(c[t]==','){s[y]=0;break;}
                if(c[t]>=48&&c[t]<=57){
                    s[y++]=c[t]-48;
                }
                else if(c[t]>=65&&c[t]<=90){
                    s[y++]=c[t]-55;
                }
            }
            for(t++;t<l;t++){
                b=b*10+c[t]-48;
            }
            memset(c,0,sizeof(c));
    
            int rec;
            int k=y;
            int p=0;
            int book=1;
            while(book){
               rec=0;
                for(int i=0;i<k;i++){
                    rec=rec*a+s[i];
                    s[i]=rec/b;
                    rec=rec-s[i]*b;
                }
                ans[p++]=rec;
                book=0;
                for(int i=0;i<k;i++){
                    if(s[i]!=0){book=1;break;}
                }
            }
            int flag=0;
            for(int i=p-1;i>=0;i--){
                if(ans[i]!=0){flag=1;}
                if(flag==1){
                    if(ans[i]>=10){printf("%c",ans[i]+55);}
                    else printf("%d",ans[i]);
                }
            }
            if(flag==0){printf("%d",0);}
            printf("
    ");
            memset(ans,0,sizeof(ans));
        }
    }
    

  • 相关阅读:
    log4j 配置文件
    log4j安装与简介
    tomcat服务
    查看系统网络连接打开端口、系统进程、DOS打开文件
    find查找指定类型文件并删除
    git/github在windows上使用
    VIM配置自动提示功能
    VIM Taglist安装配置和使用
    python Scipy积分运算大全(integrate模块——一重、二重及三重积分)
    python matplotlib绘图大全(散点图、柱状图、饼图、极坐标图、热量图、三维图以及热图)
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/9380872.html
Copyright © 2011-2022 走看看