http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=97&page=show_problem&problem=1047
题意:
输入两个大数,求乘积。
解题:
原来可以模拟乘法。。。上网找题解。。。
也学了点东西,如#ifdefine、还有数组转换时的好写法。
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
// #define LOCAL_TEST
const int MAXN = 1000;
void ConvertToNum(char str[], int num[])
{
// 这样写不用太纠结用不用n-i-1。
int len = strlen(str);
for ( int i=0, j=len-1; j>=0; ++i, --j )
{
num[i] = str[j] - '0';
} // end for
}
int main()
{
#ifdef LOCAL_TEST
freopen("f:\\in.txt", "r", stdin);
freopen("f:\\out.txt", "w+", stdout);
#endif
char strA[MAXN], strB[MAXN];
int ans[MAXN];
int numA[MAXN];
int numB[MAXN];
while ( gets(strA) && gets(strB) )
{
memset(ans, 0, sizeof(ans));
memset(numA, 0, sizeof(numA));
memset(numB, 0, sizeof(numB));
ConvertToNum(strA, numA);
ConvertToNum(strB, numB);
int lenA = strlen(strA);
int lenB = strlen(strB);
// Just simulate the procedure of multiply
int sum;
for ( int i=0; i<lenA; i++ )
{
for ( int k=0; k<lenB; k++ )
{
sum = numA[i] * numB[k] + ans[i+k];
ans[i+k] = sum % 10;
ans[i+k+1] += sum / 10;
} // end for
} // end for
int idx = lenA + lenB + 2;
while ( idx >= 0 && ans[idx] == 0 )
{
idx--;
} // end while
// if result is zero
if ( idx < 0 && ans[0] == 0 )
{
cout <<"0";
} // end if
if ( idx >=0 )
{
while ( idx>=0 )
{
cout <<ans[idx];
idx--;
} // end while
} // end if
cout <<'\n';
} // end while
return 0;
}