HDU2100 Lovekey

来源:互联网 发布:雅马哈电子琴知乎 编辑:程序博客网 时间:2024/06/05 16:31

这道题我首先 想的是将两组字符串全都转化为十进制 ,然后将其相加,然后再将其转化为二十六进制,之后我测试实例都对但wa了,我就是试了下将测试实例数组放长,程序就无法给出正解了,代码(wa)如下:

# include<stdio.h>
# include<string.h>
char a[210];
char b[201];
char c[201];
long long f(long long a,long long b){


long long  ans=1;
while(b>0){
    if(b%2==1) ans=ans*a;
    a=a*a;
    b=b/2;
}
return ans;
}
int main(){


    int i;
    long long sum1,sum2,sum;
    while(scanf("%s %s",a,b)!=EOF){
            sum1=sum2=0;
        for(i=0;i<strlen(a);i++)
                sum1=sum1+(a[i]-'A')*f(26,strlen(a)-i-1);   //我认为应该是在此处将26进制转化时数过大,无法继续存储 假设 5*26的19次方 ,想想26的19次方 也太大了吧
        for(i=0;i<strlen(b);i++)
                sum2=sum2+(b[i]-'A')*f(26,strlen(b)-i-1);
        sum=sum1+sum2;
        i=0;
        printf("%I64d\n",sum1);
        printf("%I64d\n",sum2);
        while(sum!=0){
         c[i++]=sum%26+'A';
            sum=sum/26;
        }
      for(i=strlen(c)-1;i!=-1;i--)
        printf("%c",c[i]);
      printf("\n");
      for(i=0;i<=200;i++)
        c[i]='\0';


    }
}


改正后的代码:

# include<stdio.h>
# include<string.h>
//# define max(a,b) (((a)>(b))?(a):(b))
char a[210];
char b[210];


int la[210];
int lb[210];
//将字符数组ab的值转化为十进制存放
int l[210];
int main(){
    int flag,l1,l2,i,j;


    while(~scanf("%s %s",a,b)){
        memset(la,0,sizeof(la[0])*210);
        memset(lb,0,sizeof(lb[0])*210);
        memset(l,0,sizeof(l[0])*210);
// 注意清空 la lb l 数组的值 ,这里我重新赋为0
        flag=0; // 标记 进位用
        l1=strlen(a);
        l2=strlen(b);
       for(i=0;i<l1;i++){
            la[l1-i-1]=a[i]-'A'; // 因为相加的时候是从个位开始往后加,所以将小位存放到前面,大位放到后面,这样进位也方便,最后只要倒着输出就好
   //         printf("%d ",la[l1-i-1]);
       }


       // printf("\n");
       for(i=0;i<l2;i++){
             lb[l2-i-1]=b[i]-'A';
     //           printf("%d ",lb[l2-i-1]);
       }
   // printf("\n");
       for(i=0;i<200;i++){// 注意是i<200 因为2个2位数相加可能是3位数,也可能是2位数
            l[i]=la[i]+lb[i]+flag;  //flag标记进位 , 满26进,前一个数减26 后一位数加1 (和十位数相加一样)
     //   printf("%d ",l[i]);
        if(l[i]>=26){
            l[i]-=26;
            flag=1;
        }
        else
            flag=0;


       }


        for(j=i-1;j>=1;)// 这里我是去除前导零 
            if(l[j]+'A'=='A')
                j--;
            else
                break;


        for(i=j;i>=0;i--) //倒着输出即可
            printf("%c",l[i]+'A');


        printf("\n");


    }






}


再多看看别人是怎么写的吧。。。看看还有什么方法。




0 0
原创粉丝点击