火星A+B

读入两个不超过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

分析:

使用进制转换太过于麻烦,直接用了加法模拟一下就可以了。

模拟加法操作。
我们拿样例中的 1,0 2,1来说:

个位:0+1+m(m=0)=1 个位值等于(ch1个位+ch2个位)%进制值2,s=1%2=1,进位m=1/2=0;

十位:1+2+m=3 十位值等于(ch1十位+ch2十位)%进制值3,s=3%3=0 进位m=3/3=1;

此时进位m不为0,再向高位进m得百位值为m=1

AC代码:

#include<bits/stdc++.h>
int a[1000],b[1000],s[1000];
char  ch1[1000],ch2[1000];
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 main()
{
    
    
    
        
       int k1,k2,i=0;
       
		while(scanf("%s%s",ch1,ch2))
		{
    
    
	        memset(a,0,sizeof(a));
		    memset(b,0,sizeof(b));
			memset(s,0,sizeof(s));
			if(strcmp(ch1,"0")==0&&strcmp(ch2,"0")==0)
        		break;
        	int len1=strlen(ch1);
        	int len2=strlen(ch2);
        	k1=0;
			k2=0;
        	for(i=0;i<len1;i++)
        	{
    
    
        		if(ch1[i]==',')
        		{
    
    
        			k1++;
        			continue;
				}
                a[k1]=a[k1]*10+(ch1[i]-'0');
                
			}
			for(i=0;i<len2;i++)
        	{
    
    
        		if(ch2[i]==',')
        		{
    
    
        			 k2++;
        			 continue;
				}
                b[k2]=b[k2]*10+(ch2[i]-'0');
			}
		k1++;
		k2++;
        //逆序数组,模拟加法
        for(i=0;i<k1/2;i++)//二分法 
        {
    
    
            int t=a[i];
            a[i]=a[k1-i-1];
            a[k1-i-1]=t;
        }
        for(i=0;i<k2/2;i++)
        {
    
    
            int t=b[i];
            b[i]=b[k2-i-1];
            b[k2-i-1]=t;
        } 
        int K;
        if(k1>k2)
        K=k1;
        else
        K=k2;
        int m=0; //表示进位
        for(i=0;i<K;i++)  //模拟加法
        {
    
    
            int c=a[i]+b[i]+m;
            m=c/prime[i];//进位 
            s[i]=c%prime[i];  //纪录结果
        }
        if(m)
		s[K++]=m;
        for(i=K-1;i>=0;i--)  //倒叙输出
          if(i==0) 
		  printf("%d\n",s[i]);
          else
		   printf("%d,",s[i]);

		}
       
}
#include<bits/stdc++.h>
int a[1000],b[1000],s[1000];
char  ch1[1000],ch2[1000];
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 main()
{
    
    
	while(1)
	{
    
     
		int k1,k2,i=0;
        char ch;
        memset(a,0,sizeof(a));
	    memset(b,0,sizeof(b));
		memset(s,0,sizeof(s));
		 while(scanf("%d%c",&a[i++],&ch)) 
        {
    
    
            k1=i;
            if(ch==' ') 
			break;
        }
        i=0;
        while(scanf("%d%c",&b[i++],&ch))
        {
    
    
            k2=i;
            if(ch=='\n') 
			break;
        }
        if(k1==1&&a[0]==0&&k2==1&&b[0]==0)
        {
    
    
        	return 0;
		}
        for(i=0;i<k1/2;i++)
        {
    
    
            int t=a[i];
            a[i]=a[k1-i-1];
            a[k1-i-1]=t;
        }
        for(i=0;i<k2/2;i++)
        {
    
    
            int t=b[i];
            b[i]=b[k2-i-1];
            b[k2-i-1]=t;
        } 
 
        int K;
        if(k1>k2)
        K=k1;
        else
        K=k2;
        int m=0;
        for(i=0;i<K;i++) 
        {
    
    
            int c=a[i]+b[i]+m;
            m=c/prime[i];
            s[i]=c%prime[i];
        }
        if(m)
		s[K++]=m;
        for(i=K-1;i>=0;i--)
        {
    
    
        	if(i!=0) 
		    printf("%d,",s[i]);
          else
			printf("%d\n",s[i]);
		}
		}
       
}

猜你喜欢

转载自blog.csdn.net/weixin_46703995/article/details/112471106
A+B
今日推荐