• 穷举+二分——PAT1010


    给出两个数,已知一个数的进制,求是否可以在某进制下两数相等。 

    此题有个坑,进制在35以内,但是求的进制是远大于35

    穷举法可以过大部分数据,第7个数据不能过,所以就先穷举,特殊值在二分

    View Code
    #include<stdio.h>
    #include<iostream>
    #include<stack>
    #include<math.h>
    #include<string.h>
    using namespace std;
    
    int main()
    {
        char s1[19],s2[19],st[19];
        int tag,radix,max=0;
    
    
        scanf("%s",s1);
        scanf("%s",s2);
        scanf("%d%d",&tag,&radix);
    
        if(tag==2){
            strcpy(st,s1);
            strcpy(s1,s2);
            strcpy(s2,st);
        }
        long long i,add1,add2,k,temp;
        long long all1=0,all2=0;
        for(i=0;s1[i];i++);add1=i;
        for(i=0;s2[i];i++){
            if(s2[i]<='9')temp=s2[i]-'0';
            else temp=s2[i]-'a'+10;
            if(max<temp)max=temp;
        }add2=i;
    
        for(i=add1-1;i>=0;i--){
            if(s1[i]<='9'){
                all1+=(s1[i]-'0')*(long long)pow(1.0*radix,1.0*(add1-i-1));
            }
            else{
                all1+=(s1[i]-'a'+10)*(long long)pow(1.0*radix,1.0*(add1-i-1));
            }
        }
    
        //  printf("%lld",all1);
        for(k=max+1;k<=1000000;k++){
            all2=0;
            for(i=add2-1;i>=0;i--){
                if(s2[i]<='9'){
                    all2+=(s2[i]-'0')*(long long)pow(1.0*k,1.0*(add2-i-1));
                    temp=s2[i]-'0';
                }
                else{
                    all2+=(s2[i]-'a'+10)*(long long)pow(1.0*k,1.0*(add2-i-1));
                    temp=s2[i]-'a'+10;
                }
            }
            if(all2<0){//溢出的时候特殊处理
                printf("Impossible\n");
                return 0;
            }
            if(all1==all2)break;
        }
    
    
        if((k<=1000000)&&(all1==all2))
            printf("%d\n",k);
        else
        {
            long long ll=1000000,mid,rr=10000000000;
            while(ll<=rr)//特殊数据特殊处理2分
            {
                k=(ll+rr)/2;
                all2=0;
                for(i=add2-1;i>=0;i--){
                    if(s2[i]<='9'){
                        all2+=(s2[i]-'0')*(int)pow(1.0*k,1.0*(add2-i-1));
                        temp=s2[i]-'0';
                    }
                    else{
                        all2+=(s2[i]-'a'+10)*(int)pow(1.0*k,1.0*(add2-i-1));
                        temp=s2[i]-'a'+10;
                    }
                }
                
                if(all1==all2)break;
                if(all2<0)rr=k-1;
                else{
                    if(all2>all1)rr=k-1;
                    else ll=k+1;
                }
            }
            
            if(all1==all2)
                printf("%d\n",k);
            else 
            printf("Impossible\n");
        }
    
        return 0;
    }
  • 相关阅读:
    Linux-exec族函数
    Linux-竟态初步引入
    Linux-waitpid介绍
    Java基础:Java运算符:算术运算符
    Java中的算术运算符
    JAVA冒泡排序
    引用 java的一些基本概念
    Tomcat服务器的下载安装跟基本配置
    Tomcat配置Web站点
    Tomcat+JSP经典配置实例
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3071445.html
Copyright © 2020-2023  润新知