首页 > ACM题库 > HDU-杭电 > HDU 1230 火星A+B-模拟-[解题报告] C++
2013
12-04

HDU 1230 火星A+B-模拟-[解题报告] C++

火星A+B

问题描述 :

读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……

输入:

测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。

输出:

对每个测试用例输出1行,即火星表示法的A+B的值。

样例输入:

1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0

样例输出:

1,0,1
1,1,1,0
1,0,0,0,0,0

题目 HDU 1230 火星A+B

解题思路:水题,模拟题,开始我使用的是gets得到整行,但是因为没有处理好两位数和两位以上数的问题导致WA了,后来换了个思路,用两个数组直接读取,使用第三个数组得到两个数组的和,打印的时候一定要注意答案的个数,不然会少一位数,具体神马的看代码。

#include<stdio.h>
#include<string.h>
#define MAX 110
int a[MAX],b[MAX],sum[MAX];
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 i,len,j,aCount,bCount,flag;
    char c;
    while(1)
    {
        memset(sum,0,sizeof(sum));
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        i=0;
        while(~scanf("%d%c",&a[i],&c))
        {
            if(c==' ')
                break;
            else
                i++;
        }
        aCount=i;
        i=0;
        while(~scanf("%d%c",&b[i],&c))
        {
            if(c=='\n')
                break;
            else
                i++;
        }
        bCount=i;
        if(aCount==0&&bCount==0&&a[0]==0&&b[0]==0)
            break;
        len=aCount>bCount?aCount:bCount;
        for(i=aCount,j=0;i>=0;i--)
        {
            sum[j++] += a[i];
        }
        for(i=bCount,j=0;i>=0;i--)
        {
            sum[j++] += b[i];
        }
        for(i=0;i<=len;i++)
        {
            if(sum[i]>=prime[i])
            {
                sum[i]-=prime[i];
                sum[i+1]++;
            }
        }
        if(sum[len+1])
            len++;
        for(i=len;i>=0;i--)
        {
            printf("%d",sum[i]);
            if(i>0)
                putchar(',');
        }
        printf("\n");
    }
    return 0;
}


  1. 约瑟夫也用说这么长……很成熟的一个问题了,分治的方法解起来o(n)就可以了,有兴趣可以看看具体数学的第一章,关于约瑟夫问题推导出了一系列的结论,很漂亮

  2. 很高兴你会喜欢这个网站。目前还没有一个开发团队,网站是我一个人在维护,都是用的开源系统,也没有太多需要开发的部分,主要是内容整理。非常感谢你的关注。

  3. #include <stdio.h>
    int main(void)
    {
    int arr[] = {10,20,30,40,50,60};
    int *p=arr;
    printf("%d,%d,",*p++,*++p);
    printf("%d,%d,%d",*p,*p++,*++p);
    return 0;
    }

    为什么是 20,20,50,40,50. 我觉得的应该是 20,20,40,40,50 . 谁能解释下?

  4. L(X [0 .. M-1],Y [0 .. N-1])= 1 + L(X [0 .. M-2],Y [0 .. N-1])这个地方也也有笔误
    应改为L(X [0 .. M-1],Y [0 .. N-1])= 1 + L(X [0 .. M-2],Y [0 .. N-2])