• poj1220(短除法实现任意进制转换)


    题目链接:https://vjudge.net/problem/POJ-1220

    题意:给定a进制的大数s,将其转换为b进制。其中2<=a,b<=62。

    题意:一般进制转换是以10进制为中介进行转换,但这里的s太大了,大概10^500,如果要转换十进制来算必须要手写高精度模板或者用Java的API。这里我用的短除法,复杂度比较小。原理大致是将s每次除以b,得到的余数的逆序列是b进制表示的结果。每次除的时候用到同余模定理,即从最高位开始除,得到的余数乘以a加到下一位,一直到最低位。

    AC代码:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int a,b,T,t1[1005],t2[1005];
    char s[1005];
    
    int main(){
        scanf("%d",&T);
        while(T--){
            scanf("%d%d%s",&a,&b,s);
            int len=strlen(s);
            for(int i=0;i<len;++i){
                if(s[i]>='A'&&s[i]<='Z') t1[len-1-i]=s[i]-'A'+10;
                else if(s[i]>='a'&&s[i]<='z') t1[len-1-i]=s[i]-'a'+36;
                else t1[len-1-i]=s[i]-'0';
            }
            int k=0;
            while(len){
                for(int i=len-1;i>0;--i){
                    t1[i-1]+=t1[i]%b*a;
                    t1[i]/=b;
                }
                t2[k++]=t1[0]%b;
                t1[0]/=b;
                while(len&&!t1[len-1]) --len;
            }
            printf("%d %s
    %d ",a,s,b);
            for(int i=k-1;i>=0;--i){
                if(t2[i]>=0&&t2[i]<=9) printf("%d",t2[i]);
                else if(t2[i]>=10&&t2[i]<=35) printf("%c",t2[i]-10+'A');
                else printf("%c",t2[i]-36+'a');
            }
            printf("
    
    ");
        }
        return 0;
    }

    附上Java代码(219ms,4528KB):

    import java.io.*;
    import java.math.*;
    import java.util.*;
    
    public class Main{
        public static void main(String args[]){
            Scanner cin=new Scanner(System.in);
            int T;
            BigInteger a,b,sum;
            T=cin.nextInt();
            while((T--)!=0){
                a=cin.nextBigInteger();
                b=cin.nextBigInteger();
                String s=cin.next();
                sum=BigInteger.valueOf(0);
                for(int i=0;i<s.length();++i){
                    char c=s.charAt(i);
                    int tmp;
                    if(c>='0'&&c<='9') tmp=c-'0';
                    else if(c>='A'&&c<='Z') tmp=c-'A'+10;
                    else tmp=c-'a'+36;
                    sum=sum.multiply(a);
                    sum=sum.add(BigInteger.valueOf(tmp));
                }
                BigInteger zero=BigInteger.valueOf(0);
                int ans[]=new int[1005];
                int k=0;
                while(sum.compareTo(zero)!=0){
                    ans[k++]=sum.mod(b).intValue();
                    sum=sum.divide(b);
                }
                System.out.print(a+" "+s+"
    "+b+" ");
                if(k==0) System.out.print(0);   //注意为0的情况
                for(int i=k-1;i>=0;--i){
                    int tmp=ans[i];
                    char c;
                    if(tmp<=9) c=(char)('0'+tmp);
                    else if(tmp<=35) c=(char)('A'+tmp-10);
                    else c=(char)('a'+tmp-36);
                    System.out.print(c);
                }
                System.out.print("
    
    ");
            }
        }
    }
  • 相关阅读:
    用PS设计一个简单的立体字
    Photoshop如何查看各种字体
    花生壳内网穿透
    mac版FTP
    根据平时的使用情况列出经常用的mac终端命令以便以后方便查找
    Text 组件的样式
    react-native 开发中遇到的坑
    react-native-swiper 使用遇到的坑
    详解intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance
    WebStorm里面配置运行React Native的方案
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10823456.html
Copyright © 2020-2023  润新知