申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2011年11月6日 星期日

[高精度運算]OI練習題:火星上的加法運算 madition 解題報告

【題目描述】
最近歡歡看到一本有關火星的書籍,其中她被一個加法運算所困惑,由於她的運算水平有限,她想向你求助,作爲一位優秀的程序員,你當然不會拒絕。
輸入文件(madition.in):
第一行先輸入一個運算的進制N(2<=N<=36),接下來的兩行爲需要進行運算的字符,其中每個字符串的長度不超過200位.其爲N進制的數。其中包括0-9及a-z(代表10-35).
輸出文件(madition.out):
在N進制下它們的和.
輸入樣例1:
20
1234567890
abcdefghij
輸出樣例1:
bdfi02467j
輸入樣例2:
20
99999jjjjj
9999900001
輸出樣例2:
iiiij00000


【分析】
高精度運算的變形。只需要注意 高精度計算時 滿N進一,以及最後輸出後把大於10的數轉化為小寫字母。

【我的代碼】
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

class hugeint
{
public:
    int len;
    int num[300];
    hugeint()
    {
        len=1;
        memset(num,0,sizeof(num));
    }
}Ans,A,B;
int N;

void init()
{
    scanf("%d\n",&N);
    char str1[300],str2[300];
    memset(str1,'\0',sizeof(str1));
    memset(str2,'\0',sizeof(str2));
    scanf("%s\n%s",&str1,&str2);
   
    int la=strlen(str1);
    int lb=strlen(str2);
   
    A.len=la;
    B.len=lb;
    int tmp;
    for (int i=0;i<la;i++)
    {
        if(str1[i]>='a' && str1[i]<='z')
            tmp=str1[i]-'a'+10;
        else
            tmp=str1[i]-'0';
        A.num[la-i]=tmp;
    }
   
    for (int i=0;i<lb;i++)
    {
        if(str2[i]>='a' && str2[i]<='z')
            tmp=str2[i]-'a'+10;
        else
            tmp=str2[i]-'0';
        B.num[lb-i]=tmp;
    }   
   
    return;
}

void add()
{
    int i;
    if (A.len>B.len)
        Ans.len=A.len;
    else
        Ans.len=B.len;
    for (i=1;i<=Ans.len;i++)
    {
        Ans.num[i]+=(A.num[i]+B.num[i]);
        Ans.num[i+1]+=Ans.num[i]/N;
        Ans.num[i]%=N;
    }
    if (Ans.num[Ans.len+1]>0)
        Ans.len++;
    return;
}

void print()
{
    for (int i=Ans.len;i>=1;i--)
    {
        if(Ans.num[i]<10)
            cout<<Ans.num[i];
        else
            cout<<(char)(Ans.num[i]-10+'a');
    }
    return;
}

int main()
{
    freopen("madition.in","r",stdin);
    freopen("madition.out","w",stdout);
    init();
    add();
    print();
    return 0;
}

沒有留言:

張貼留言