大数之间的运算在ACM竞赛中一直比较热门,其实就是模拟手算过程。在各大oj上一般是给新手用来锻炼使用,不过纵观很多oj这样的题目成功率还是相当的低。

午饭后休息没事儿干,随便敲了一下大数间的乘法,这在大数运算中属于比较简单的一种算子。

http://cs.scu.edu.cn/soj/1003

两个数乘积的位数 len,与两数位数len1,len2的关系,一般len<=len1+len2,这样的话思路就比较清晰啦,剩下的就是一些末枝问题。

 

#include
#include
#include
#include
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   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   for(int Pnd=0;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;
}