Q15—确定进制 函数,简化程序,strlen,进制转换

来源:互联网 发布:mac uefi 编辑:程序博客网 时间:2024/05/22 12:39

这道题在百炼上的编号是: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;}



 

原创粉丝点击