zoukankan      html  css  js  c++  java
  • 火星A+B(hdu1230)进制转化

    火星A+B

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 10634 Accepted Submission(s): 3547


    Problem Description
    读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
     
    Input
    测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
     
    Output
    对每个测试用例输出1行,即火星表示法的A+B的值。
     
    Sample Input
    1,0 2,1
    4,2,0 1,2,0
    1 10,6,4,2,1
    0 0
     
    Sample Output
    1,0,1
    1,1,1,0
    1,0,0,0,0,0
     
     
    题意:中文题,应该不要太讲题意吧;
     
    思路:每位相加,再和每位的进制数比,大了的和进制数相减,然后高位加一;关键是处理字符和数字的转换,以及最高位的进位问题;否则位数不对。
     
    #include<stdio.h>
    #include<string.h>
    
    int prime[26]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
    int a[30],b[30],sum[30];
    char aa[1000],bb[1000];
    int main()
    {
        char ch;
        int i,j,k;
        while(scanf("%s%s",aa,bb)!=EOF)
        {
            if(strlen(aa)==1&&strlen(bb)==1&&aa[0]=='0'&&bb[0]=='0')
                break;
    //       printf("%s	%s
    ",aa,bb);
            for(i=0;i<30;i++)
                a[i]=b[i]=sum[i]=0;
            int lena=0,temp=0;
            for(i=0; i<strlen(aa); i++)
            {
                if(aa[i]!=',')
                {
                    temp*=10;
                    temp+=aa[i]-'0';
    
                }
    //           printf("%d	",temp);
                if(aa[i]==',')
                {
                    a[lena++]=temp;
                    temp=0;
                }
            }
            a[lena]=temp;
    //        for(i=0;i<=lena;i++)
    //        printf("%d	",a[i]);
     //      printf("
    ");
            int lenb=0;
            temp=0;
            for(i=0; i<strlen(bb); i++)
            {
                if(bb[i]!=',')
                {
                    temp*=10;
                    temp+=bb[i]-'0';
    
                }
                if(bb[i]==',')
                {
                    b[lenb++]=temp;
                    temp=0;
                }
            }
            b[lenb]=temp;
     //       for(i=0; i<=lenb; i++)
     //           printf("%d	",b[i]);
     //       printf("
    ");
            int len=0;
            int cnt=0;//进位
     //       printf("a[lena]=%d	b[lanb]=%d
    ",a[lena],b[lenb]);
            for(i=lena,j=lenb,k=0;i>=0||j>=0;k++,i--,j--)
            {
                if(i<0) sum[k]+=b[j];
                else if(j<0) sum[k]+=a[i];
                else sum[k]+=a[i]+b[j];
    
                if(sum[k]>=prime[k])
                {
                    sum[k]-=prime[k];
                    sum[k+1]++;
                }
            }
    
            printf("%d",sum[k]>0?sum[k]:sum[--k]);
            for(i=k-1;i>=0;i--)
            {
                printf(",%d",sum[i]);
            }
            printf("
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    SecureRandom
    《Head First 设计模式》[02] 观察者模式
    《MySQL必知必会》[07] 管理事务处理
    《MySQL必知必会》[06] 触发器
    《MySQL必知必会》[05] 存储过程和游标
    Centos7安装Nginx
    IDEA配置Tomcat
    Java小功能大杂烩
    Java处理中文乱码问题
    Java邮件发送
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/3932648.html
Copyright © 2011-2022 走看看