求1234567891011121314151617181920*2019181716151413121110987654321的值

 
/*
求1234567891011121314151617181920*2019181716151413121110987654321的值. 
用数组去做,把第1个大数和第2个大数分别用数组表示. 格式举例如下:
9 8 7 6 5 4 3 2 1 0 <----------代表数组的位
-------------------
        7 8 9 6 5 2
            3 2 1 1 *
-------------------
        7 8 9 6 5 2 <-----------第1趟 
      7 8 9 6 5 2   <-----------第2趟 
     ..........     <-----------第n趟 
-------------------
  ? ? ? ? ? ? ? ? ? <-----------最后的值用另一个数组表示 
*/
 
#include <iostream>
using namespace std;

void print(int a[], int len);
void multiply(int a[], int aLen, int b[], int bLen, int ans[], int ansLen);

int main()
{
    int iArr1[] = {0,2,9,1,8,1,7,1,6,1,5,1,4,1,3,1,2,1,1,1,0,1,9,8,7,6,5,4,3,2,1};
    int iArr2[] = {1,2,3,4,5,6,7,8,9,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,0,2};
    int iLen1 = sizeof(iArr1) / sizeof(int);
    int iLen2 = sizeof(iArr2) / sizeof(int);
    int ansLen = iLen1 + iLen2;
    int *ansArr = new int [ansLen];
    int i;
    
    for (i = 0; i < ansLen; i++)
        ansArr[i] = 0;
    
    print(iArr1, iLen1);
    cout << " * ";
    print(iArr2, iLen2);
    cout << " = \n";
    multiply(iArr1, iLen1, iArr2, iLen2, ansArr, ansLen);
    
    print(ansArr, ansLen);    
    delete [] ansArr;
	cout << "\n\n\n";
    system("PAUSE");
    return 0;
}

void print(int a[], int len)
{
    int i;
    i = len - 1;
    while( 0 == a[i])
        --i;
    while( i >= 0 )
        printf("%d", a[i--]);
}

void multiply(int a[], int aLen, int b[], int bLen, int ans[], int ansLen)
{
    int i, j, minLen, tmp, inc;
    int *shortarr, *longarr;
    if (aLen < bLen)
    {
        shortarr = a;
        longarr = b;
        minLen = aLen;
    }
    else
    {
        shortarr = b;
        longarr = a;
        minLen = bLen;
    }
    
    for (i = 0; i < minLen; i++) //共minLen趟
    {
        for (j = 0; j < aLen + bLen - minLen; j++)
        {
            tmp = shortarr[i] * longarr[j];
            ans[i + j] += tmp;
        }
    }
    
    //处理进位
    for (i = 0; i < ansLen; i++)
    {
        tmp = ans[i] / 10;
        ans[i] %= 10;
        ans[i + 1] += tmp;
    }
    
}
/*
输出结果:
1234567891011121314151617181920 * 2019181716151413121110987654321 =
2492816912877266687794240983772975935013386905490061131076320     
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值