[hdu]1230 火星A+B

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230

解题思路:

     刚开始是做法是直接把a跟b转化成十进制数,加完后再转化,最后一看是25位,数据太大存不下,只能用数组做了,用两个数组做把个位的放在数组的第一位,这样就不会考虑高位放在第一位,进位的问题了,然后把两个数组相加,每一位除以prime[i]看是否大于一,大于一就要有进位,进位为/prime[i],该位进位后剩下%prime[i];输出 时候判断去两个数组的最大长度那一位判断是否大于0,!具体实现看代码:

AC代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char s1[505],s2[505];
int c[505],d[505];
int prime[30]={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,103,107,109,113};
int main()
{
    int len1,len2,i,j,temp;
    while(scanf("%s%s",s1,s2))
    {
        if(strcmp(s1,"0")==0&&strcmp(s2,"0")==0) break;
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        len1=strlen(s1);len2=strlen(s2);
        temp=1;
        for(i=len1-1,j=0;i>=0;i--)
        {
            if(s1[i]==',')
            {
                j++;temp=1;
            }
            else
            {
                c[j]+=(temp*(s1[i]-'0'));
                temp*=10;
            }
        }len1=j+1;
        temp=1;
        for(i=len2-1,j=0;i>=0;i--)
        {
            if(s2[i]==',')
            {
                j++;temp=1;
            }
            else
            {
                d[j]+=(temp*(s2[i]-'0'));
                temp*=10;
            }
        }len2=j+1;
        if(len1<len2) len1=len2;
        for(i=0;i<len1;i++)
        {
            c[i]+=d[i];
            if(c[i]/prime[i]!=0)
            {
                c[i+1]+=(c[i]/prime[i]);
                c[i]%=prime[i];
            }
        }
        for(i=(c[len1]==0?len1-1:len1);i>=0;i--)
        {
            printf("%d%c",c[i],i==0?'
':',');
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gaojupeng/p/4485009.html