您的位置:首页 > 其它

杭电acm 1230 火星A+B

2017-05-11 16:47 190 查看

火星A+B

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 13   Accepted Submission(s) : 3

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

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
想法:
看似进制问题,其实跟进制关系不大,主要用到素数,字符窜处理,和大数处理思想,最重要是解题思路清晰,理解难度不大。
首先我们找出从2到10010素数 ,用c【i】保存i位的进制
然后把火星数字的,去掉(注意我们保存火星数字的是asii码值,记得转化为数字,输入的是从低位到高位而输出的是从高位到低位)
最后要把两个火星数每位数值加起,注意每位数值加法进制不一样,要用到c【i】
 火星数字加法代码:
for(i=1,d=0;i<=maxx;i++)
  {
    cr[i]=c1[i]+c2[i]+d;
           d=0;
     if(i==maxx&&cr[i]>=c[i])
       {
            cr[i]=cr[i]%c[i];
            cr[++maxx]=1;
            break;
       }
       if(cr[i]>=c[i])
       {
          cr[i]=cr[i]%c[i];
           d=1;
       }

  }

代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 10010
char a[M],b[M];
int c[M];
int c1[M],c2[M];
int cr[M];
int d1[M];
int max(int x,int y)
{
    return x>y?x:y;
}
int po(int x1)
{
    int i,sum=1;
    if(x1==0)
        return sum;

        for(i=1;i<=x1;i++)
                sum*=10;
        return sum;
}

int main()
{
    int i,j,n;
    memset(d1,0,sizeof(d1));
    for(i=2;i<=M;i++)
        for(j=i;i*j<=M;j++)
        {
           d1[i*j]=1;
        }
    for(i=2,n=1;i<=M;i++)
    if(d1[i]==0)
    {
        c[n++]=i;
    }
    while(scanf("%s%s",a,b)!=EOF)
    {
        if(a[0]=='0'&&b[0]=='0')
            break;
        int len1,len2;
        len1=strlen(a);
        len2=strlen(b);
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        memset(cr,0,sizeof(cr));
        int l,h,w=0;
        for(i=len1-1,l=1,w=0;i>=0;i--)
        {
            if(a[i]==',')
            {
                l++;
                w=0;
            }
            else
            {
                c1[l]+=(a[i]-'0')*po(w++);
            }
        }
         for(i=len2-1,h=1,w=0;i>=0;i--)
        {
            if(b[i]==',')
            {
                h++;
                w=0;
            }
            else
            {
                c2[h]+=(b[i]-'0')*po(w++);
            }
        }
        int maxx=max(l,h);
        int d;
       for(i=1,d=0;i<=maxx;i++)
       {
           cr[i]=c1[i]+c2[i]+d;
           d=0;
           if(i==maxx&&cr[i]>=c[i])
           {
               cr[i]=cr[i]%c[i];
               cr[++maxx]=1;
               break;
           }
           if(cr[i]>=c[i])
           {
              cr[i]=cr[i]%c[i];
              d=1;
           }

       }
       for(i=maxx;i>1;i--)
            printf("%d,",cr[i]);
       printf("%d\n",cr[i]);

    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: