问题链接: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 == ' ') 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 ", sum[0]); } return 0; }
其中,数组a、b和sum分别用于存储数A、数B和A+B(和)。
需要注意的是,读入的数据从左到右是从高位到低位。然而,进行计算时,需要从低位到高位进行计算,以便于有进位时进行进位计算。