哈哈我也来发一个。

代码:
/************************************************************************
Author: xiep
Date  : 2008-9-27
其实像大数乘法,加法,减法,阶乘问题常见算法是用数组或向量(vector)等模拟手算。
只考虑了非负数的情形。
测试用例考虑了大数乘大数,
              大数乘小数,
              小数乘大数,
              小数乘小数,
          以及0乘和乘0。
*************************************************************************/

#include <fstream>
#include <assert.h>
using namespace std;

#define  MAX_LEN  10000 + 1

void by(int res[],    //保存结果,顺序存储
    int num1[],    //被乘数,顺序存储
    int len1,    //被乘数位数
    int num2[],    //乘数,顺序存储
    int len2)    //乘数位数
{
  int i,j,k;      //循环变量
  int lenres=len1+len2;    //结果数组的长度

  //将结果数组初始化为0,这是必须的
  for(i=0; i<lenres; i++)
    res[i]=0;
  
  //构造一个大小等于被乘数的数组,用于保存中间结果
  int *temp = new int[len1];
  assert( NULL != temp );
  
  //关键代码
  int index=0;
  for(i=len2-1; i>=0; i--)    //乘数
  {
    index++;
    for(k=lenres-index,j=len1-1; j>=0; k--,j--)
    {
      temp[j] = num1[j]*num2[i];  //乘
      res[k] += temp[j];    //将中间结果加入结果数组
    }
  }
  delete[] temp;          //回收内存
  
  int tmp,carry=0;
  for (i=lenres-1; i>0; i--)
  {
    tmp = res[i]+carry;      //因为( (2^31-1) - (2^31-1)/10 ) / 81 = 50373073
    res[i] = tmp % 10;      //所以乘数最多可以是 50373073 位
    carry = tmp /10;            //被乘数位数不限,保证不溢出
  }
  res[0]=carry;
}


int main(void)
{
  fstream in( "in.txt" );
  fstream out( "out.txt" );

  char chNum1[MAX_LEN], chNum2[MAX_LEN];

  int testcaseNum;
  in>>testcaseNum;

  int i;
  while(testcaseNum--)
  {
    in>>chNum1>>chNum2;
    int len1 = strlen(chNum1);
    int len2 = strlen(chNum2);
    
    int intNum1[MAX_LEN],            //被乘数
      intNum2[MAX_LEN],            //乘数
      *result=new int[len1+len2];        //结果  
    assert( NULL != result);
    
    for(i=0; i<len1; i++)
      intNum1[i]=chNum1[i]-'0';

    for(i=0; i<len2; i++)
      intNum2[i]=chNum2[i]-'0';
    
    by(result,intNum1,len1,intNum2,len2);    //乘
    
    //输出结果
    bool remain0 = true;
    for(i=0; i<len2+len1; i++)
    {
      if( result[i] != 0 ) remain0 = false;
      if( !remain0 ) out<<result[i];
    }
    if( remain0 ) out<<"0";
    out<<endl;
    
    delete[] result;              //回收内存
  }
  
    return 0;
}
上传的附件 4.rar