最近歡歡看到一本有關火星的書籍,其中她被一個加法運算所困惑,由於她的運算水平有限,她想向你求助,作爲一位優秀的程序員,你當然不會拒絕。
輸入文件(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;
}
#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;
}
沒有留言:
張貼留言