hdu1230(火星A+B)

发表于: 2012年04月30 00:00

###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

###Source

浙大计算机研究生复试上机考试-2006年

下面是我的代码 ,开始看题目以为很难。代码完成后再回故,感觉还好。关键是要保持思路清晰

:::c++
#include<stdio.h>
#include<string.h>
int pre[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};
char arr1[100];
char arr2[100];
int num1[30];
int num2[30];

int chang(char *p, int *n,int m)
{
    int i=0;
    int sum=0;
    int len=0;
    while(i<m)
    {
       for(;i<m && p[i]!=',';i++)
          sum=sum*10+p[i]-'0';
       n[len]=sum;
       sum=0;
       len++;
       i++;
    }
    return len;
}
void add(int *n,int *m,int *l)//n>m,l1>l2
{
   int flag=0;
   int i;
   for(i=0;i<*l;i++)
   {
      n[i]=n[i]+m[i]+flag;
      flag=0;
      if(n[i]>=pre[i])
      {
         flag=n[i]/pre[i];
         n[i]=n[i]%pre[i];
      }
   }
   if(flag)
   {
       n[i]=flag;
       *l=*l+1;
   }
}

void swap(int *n,int m)  ////数组变换,首位换位
{
   int i=0;
   int temp;
   m--;
   while(i<m)
   {
       temp=*(n+i);
       *(n+i)=*(n+m);
       *(n+m)=temp;
       i++;
       m--;
   }
}
int main()
{
   int l1,l2;
   int i=0;
   while(scanf("%s%s",arr1,arr2),strcmp(arr1,"0") || strcmp(arr2,"0"))
   {
         memset(num1,0,sizeof(num1));
         memset(num2,0,sizeof(num2));
         l1=chang(arr1,num1,strlen(arr1));
         l2=chang(arr2,num2,strlen(arr2));
         swap(num1,l1);
         swap(num2,l2);
         if(l1>l2) 
         {
             add(num1,num2,&l1);
             swap(num1,l1);
             for(i=0;i<l1-1;i++)
                printf("%d,",num1[i]);
             printf("%d\n",num1[i]);
         }
         else
         {
             add(num2,num1,&l2);
             swap(num2,l2);
             for(i=0;i<l2-1;i++)
                 printf("%d,",num2[i]);
             printf("%d\n",num2[i]);
         }
  }

   return 0;
}
© 2018 - fluyy - 粤ICP备17114935号