这道题在百炼上的编号是:2972
这道让我知道了自己在处理事情的逻辑上还有问题,编码能力还有待提高,代码的质量还有待优化,路漫漫修远兮,我需要的是昂起斗志,努力编码;
周五的时候,按照自己的思维过程进行code,结束后在pc上的编译器进行编译,成功通过,但是提交的时候是wrong answer,当时想了很久都不知道是哪里错了(现在觉得是十进制转换上出现了错误)。
搁浅,周日晚上,百度之,想看看别人的处理方法是否和我的一样,事实证明,我们的思维过程是一样的
都是希望将p,q,r转换为10进制,然后进行比较,看p*q==r?
但是看看代码,我把代码写成了浆糊。。。。
so,我决定安静的学学别人是如何写代码的:
1、学会多写函数,函数可以让程序变的简练,也提高了代码的重用性。将一个小功能,就可以写一个函数,在主函数调用就好了,瞬间感觉这样写代码,编程者的逻辑很清楚。
2、char str[100];
strlen(str),可以求得字符数组的长度。作为循环的边界
以后如果遇到进制转换问题,都用字符数组来表示。这样就不用 转换10进制的时候一会除10,一会余10了。这个很重要。
3、下面的这段代码,可以Mark,这是所有进制转换为10进制的代码,以后用的话就不用自己推敲很长时间,可以直接拿来用:
ret*=b; //将所有进制的数转换为10进制 str[0]*bn+str[1]*b[n-1]+...别弄反了
ret+=str[i]-'0';
4、命名,code的时候,希望小P同志不要老用a,b,c来表示变量了,这样以后看代码都不知道是什么意思,尽量用英文单词。
下面是这道题的代码,后面注释的是我之前自己写的,一坨浆糊,以此名戒!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
//函数,将数转换为10进制
int ten(char *str,int b)
{
int i,len;
int ret=0;
len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]-'0'>=b)
return -1;
else{
ret*=b; //将所有进制的数转换为10进制 str[0]*bn+str[1]*b[n-1]+...别弄反了
ret+=str[i]-'0';
}
}
return ret;
}
int main()
{
int *result=(int *)malloc(sizeof(int));
int k=0;
int j,b,n;
scanf("%d",&n);
char p[8],q[8],r[8];
int pret,qret,rret;
while(n--)
{
scanf("%s %s %s",p,q,r);
for(b=2;b<=16;b++)
{
pret=ten(p,b);
qret=ten(q,b);
rret=ten(r,b);
if(pret==-1||qret==-1||rret==-1)
continue;
if(qret*pret==rret)
{
result[k]=b;
k++;
break;
}
}
if(b==17)
{
result[k]=0;
k++;
}
}
for(j=0;j<k;j++)
printf("%d\n",result[j]);
/*
int i,n;
scanf("%d",&n);
int *p=(int *)malloc(n*sizeof(int));
int *q=(int *)malloc(n*sizeof(int));
int *r=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++){
scanf("%d %d %d",&p[i],&q[i],&r[i]);
if(p[i]>1000000||p[i]<1||q[i]>1000000||q[i]<1||r[i]>1000000||r[i]<1)
printf("wrong input\n");
}
double z;
int *b=(int *)malloc(n*sizeof(int));
//计算结果都转换为10进制,判断两边是否相等;
//int num=0;
int mp,mq,mr;
int *a=(int *)malloc(sizeof(int));
int temp;
int k,t;
int j;
for(j=0;j<n;j++)
{
int flag=0;
mp=p[j];
mq=q[j];
mr=r[j];
for(i=2;i<=16;i++)
{
p[j]=mp;
q[j]=mq;
r[j]=mr;
temp=0;
//求sump
double sump=0;
t=0;
while(p[j]%10!=0){ //提取个十百位上的数字,并判断是否大于等于当前进制
a[t]=p[j]%10;
if(a[t]>=i)
{
temp=1;
}
t++;
p[j]=p[j]/10;
}
for(k=0;k<t;k++)
{
z=pow(i,k); //算出转换进制后的总和
sump+=a[k]*z;
}
double sumq=0;
t=0;
while(q[j]%10!=0){
a[t]=q[j]%10;
if(a[t]>=i)
{
temp=1;
}
t++;
q[j]=q[j]/10;
}
for(k=0;k<t;k++)
{
z=pow(i,k);
sumq+=a[k]*z;
}
double sumr=0;
t=0;
while(r[j]%10!=0){
a[t]=r[j]%10;
if(a[t]>=i)
{
temp=1;
}
t++;
r[j]=r[j]/10;
}
for(k=0;k<t;k++)
{
z=pow(i,k);
sumr+=a[k]*z;
}
if(temp==1)
continue;
if((sump*sumq)==sumr) //进行比较,看是否为满足要求的进制,如果是,载入结果,并结束本次查找
{
b[j]=i;
flag=1;
break;
}
}
if(flag==0)
{
b[j]=0;
}
//printf("%d",j);
}
for(i=0;i<n;i++)
printf("%d\n",b[i]);
*/
return 0;
}