题目: 给定一个数 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 ;
}