HDU1230 火星A+B【进制】

问题链接HDU1230 火星A+B

问题简述:参见上述链接。

问题分析这是一个有关进制的问题,需要了解进制的原理,相关知识背景是必要的

人们通常使用10进制,每一位都是逢10进1。另外一个重要的概念是位权的概念,即每一个位置不同的数字其权值不同。10进制中,个位的权是1,十位的权是10,百位的权是100,依此类推。10进制中,高1位(左边位)的权是低一位(右边位)的10倍。

然而,这个问题的每一位的权是素数,这一点有所不同,没有任何问题,也是可以计算的。

程序说明(略)。


AC的C语言程序如下:

/* HDU1230 火星A+B */

#include <stdio.h>
#include <memory.h>

#define MAXN    30

int primes[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[MAXN], b[MAXN], sum[MAXN], acount, bcount, count;
char c;

int main(void)
{
    int i, j;

    while(1) {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        memset(sum, 0, sizeof(sum));

        i = 0;
        for(;;) {
            scanf("%d%c", &a[i], &c);
            if(c == ' ')
                break;
            else
                i++;
        }
        acount = i;

        i = 0;
        for(;;) {
            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;

        count = (acount > bcount) ? acount : bcount;

        for(i=acount, j=0; i >= 0; i--, j++)
            sum[j] += a[i];

        for(i=bcount, j=0; i >= 0; i--, j++)
            sum[j] += b[i];

        for(i=0; i<=count; i++)
            if(sum[i] >= primes[i]) {
                sum[i] -= primes[i];
                sum[i+1]++;
            }
        if(sum[count+1])
            count++;

        for(i=count; i>0; i--)
            printf("%d,", sum[i]);
        printf("%d\n", sum[0]);
    }

    return 0;
}

其中,数组a、b和sum分别用于存储数A、数B和A+B(和)。

需要注意的是,读入的数据从左到右是从高位到低位。然而,进行计算时,需要从低位到高位进行计算,以便于有进位时进行进位计算。

posted on 2016-05-27 22:33  海岛Blog  阅读(237)  评论(0编辑  收藏  举报

导航