大数之间的运算在ACM竞赛中一直比较热门,其实就是模拟手算过程。在各大oj上一般是给新手用来锻炼使用,不过纵观很多oj这样的题目成功率还是相当的低。
午饭后休息没事儿干,随便敲了一下大数间的乘法,这在大数运算中属于比较简单的一种算子。
两个数乘积的位数 len,与两数位数len1,len2的关系,一般len<=len1+len2,这样的话思路就比较清晰啦,剩下的就是一些末枝问题。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max = 500;
char front[Max];
char back[Max];
int rslt[2*Max+3];
int index_num;
/*功能:实现对全局数组、变量的初始化*/
void Init()
{
memset(front,'0',sizeof(front));
memset(back,'0',sizeof(back));
for(int i=0;i<2*Max+3;i++)
rslt[i] = 0;
index_num = 0;
}
/*功能:对输入数组的逆序。
习惯性表达:高位在前、地位在后,但输入时恰恰相反,所以需要逆序。
但逆序不是必须的,也可以从后向前运算噻*/
void Reverse(char* cav,int len)
{
int pnd = len/2;
for(int i=0;i<pnd;i++)
swap(cav[i],cav[len-1-i]);
}
/*功能:运算的具体过程模拟*/
void Multi()
{
int len_f = strlen(front);
int len_b = strlen(back);
Reverse(front,len_f);
Reverse(back,len_b);
for(int Ick=0;Ick<len_f;Ick++)
for(int Pnd=0;Pnd<len_b;Pnd++)
{
int temp = (front[Ick]-'0')*(back[Pnd]-'0');
rslt[Ick+Pnd] += temp%10;
rslt[Ick+Pnd+1] += temp/10;
index_num = Ick+Pnd+1;
}
for(int i=0;i<=index_num;i++)
{
if(rslt[i]>9)
{
int temp = rslt[i];
rslt[i] %= 10;
rslt[i+1] += temp/10;
}
}
index_num += 2;
}
/*输出计算结果*/
void Print()
{
while(!rslt[--index_num]);
for(int i=index_num;i>=0;i--)
printf("%d",rslt[i]);
printf("\n");
}
int main()
{
Init();
while(scanf("%s%s",front,back)==2)
{
Multi();
Print();
Init();
}
return 0;
}
转载于:https://blog.51cto.com/jeick/542548