UVA 343 What Base Is This?

题目: 给定一个数 X ,与另一个数 Y 。 求 X,Y 分别在2-36进制下,转换成10进制后相等的「各自进制」。
目的:求X Y各自满足条件的进制。

例:12 (base 3) = 5 (base 6)
解释: X=12为「3进制」下的数字,Y=5为「6进制」下的数字,12与5转化成10进制后相等。

分析: 确定 X 中最大数字maxnum。 把 X 从[maxnum+1,36]进制下转换成10进制。 Y 重复1,2步骤。循环判断何时10进制相等。 输出。

注意: 1.没有1进制。(题目中的 inclusive 是指36 0 (base 2) = 0 (base 2)  )   2.我数据类型把int全部设为long long ,结果一直 PE 。不知道什么原因。

代码1(自己实现各进制转10进制)

#include"stdlib.h"
#include"stdio.h"
#include"string.h"
void basecompare(long long base1[],long long base2[],char put1[],char put2[],int  maxnum1,int  maxnum2);
int   findmaxnum(char put[]);
void base1to36(long long base[],char put[],int maxnum);
int main()
{
    char put1[50],put2[50];
    long long  base1[37]= {0},base2[37]= {0};
    int maxnum1,maxnum2;
    while(scanf("%s %s",put1,put2)==2)
    {

        memset(base1,0,sizeof(base1));
        memset(base2,0,sizeof(base2));
        maxnum1=findmaxnum(put1);
        base1to36(base1,put1,maxnum1);
        maxnum2=findmaxnum(put2);
        base1to36(base2,put2,maxnum2);
        basecompare(base1,base2,put1,put2,maxnum1,maxnum2);
    }
    return 0;
}
int   findmaxnum(char put[])
{
    char max;
    int i,num;
    max=put[0];
    for(i=1; i<strlen(put); i++)
    {
        if(max<put[i])
        {
            max=put[i];
        }
    }
    if(max>'0' && max<='9')
    {
        num=max-'0';
    }
    else if(max=='0')
    {
        num=1;
    }
    else
        num=max-'A'+10;
    return num;
}
void basecompare(long long base1[],long long base2[],char put1[],char put2[],int maxnum1,int maxnum2)
{
    int  i,j;

            for(i=maxnum1+1; i<=36; i++)
            {
                for(j=maxnum2+1; j<=36; j++)
                {
                    if(base1[i]==base2[j])
                    {
                        printf("%s (base %d) = %s (base %d)\n",put1,i,put2,j);
                        return;
                    }
                }
            }
            printf("%s is not equal to %s in any base 2..36\n",put1,put2);
    return;
}
void base1to36(long long base[],char put[],int maxnum)
{
    long long i,j,sum=0,pow,num,len;
    len=strlen(put);
    for(i=maxnum+1; i<=36; i++)
    {
        pow=1;
        for(j=0; j<len; j++)
        {

            if(put[len-j-1]>='0' && put[len-j-1]<='9')
            {
                num=put[len-j-1]-'0';
            }
            else
                num=put[len-j-1]-'A'+10;
            sum+=pow*num;
            pow*=i;
        }
        base[i]=sum;
        sum=0;
    }
    return;
}

代码二(使用strtol函数实现各进制转10进制)

#include"stdlib.h"
#include"stdio.h"
#include"string.h"
void basecompare(char put1[],char put2[],int maxnum1,int maxnum2);
int   findmaxnum(char put[]);
int main()
{
    char put1[50],put2[50];
    int   maxnum1,maxnum2;
    while(scanf("%s %s",put1,put2)==2)
    {
        maxnum1=findmaxnum(put1);
        maxnum2=findmaxnum(put2);
        basecompare(put1,put2,maxnum1,maxnum2);
    }
    return 0;
}
int   findmaxnum(char put[])
{
    char max;
    long long i,num;
    max=put[0];
    for(i=1; i<strlen(put); i++)
    {
        if(max<put[i])
        {
            max=put[i];
        }
    }
    if(max>'0' && max<='9')
    {
        num=max-'0';
    }
    else if(max=='0')
    {
        num=1;
    }
    else
        num=max-'A'+10;
    return num;
}
void basecompare(char put1[],char put2[],int maxnum1,int maxnum2)
{
    if(maxnum1==0 && maxnum2==0)
        printf("0 (base 2) = 0 (base 2)");
    else
    {
        for(int i = maxnum1+1; i<=36 ; i++)
        {
            for(int j = maxnum2+1; j<=36; j++)
            {
                if (strtol(put1, NULL, i) == strtol(put2, NULL, j))
                {
                    printf("%s (base %d) = %s (base %d)\n",put1,i,put2,j);
                    return;
                }
            }
        }
    }
    printf("%s is not equal to %s in any base 2..36\n",put1,put2);
    return ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值