百炼OJ 大整数乘法

总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过200位的非负整数的积。

输入
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入

12345678900
98765432100

样例输出

1219326311126352690000

提示
30%的数据,输入的两个整数不超过8位。

我的思路:
将输入的两个数分别存到数组中,数组中的每一个元素存储数字的一位数。之后类似人类计算方式,每次用第二个数的一位乘以第一个数的所有位,再累加。注意一点:两数的第a,b位相乘得到的数,会累加到最终乘积(即结果)的第a+b位。 借鉴了 https://blog.csdn.net/LJWLgl/article/details/52799082 的想法。

额外C++知识点补充:
1.strlen()与sizeof()的区别:二者都是求字符串的长度。strlen() 用来计算指定字符串的长度,但不包括结束字符(即 null 字符);sizeof()则包括结束字符。
2.cin与gets()的区别:cin不接受空格,TAB等键的输入,遇到这些键,字符串会终止;gets()则接受连续的输入,包括空格,TAB。

代码及注释见下:

#include
#include 
#define MAX_LEN 200
using namespace std;

unsigned v1[MAX_LEN+10];    /*选取unsigned的原因在于 每个数组元素只存储1位数字 这样省内存*/
unsigned v2[MAX_LEN+10];
unsigned result[MAX_LEN*2+10];
char cin1[MAX_LEN+10];
char cin2[MAX_LEN+10];

int main()
{
    int len1,len2;
    gets( cin1);//将输入读入到字符数组中
    gets( cin2);

    len1 =strlen(cin1);
    len2 =strlen(cin2);

    memset(v1,0,sizeof(v1));//初始化整型数组  
    memset(v2,0,sizeof(v2));
    memset(result,0,sizeof(result));

    int i;
    i=0;
    for(int j=len1-1;j>=0;j--) //数组下标从0到len-1,依次存储数的从高到低位
    {
        v1[i++]=cin1[j]-'0'; //字符-字符得到数值
    }
    i=0;
    for(int j=len2-1;j>=0;j--) 
    {
        v2[i++]=cin2[j]-'0'; 
    }


    for(int a=0;a=10)
        {
            result[a+1]+=result[a]/10;
            result[a]%=10;
        }
    }

    //下面进行输出
    bool bStartOutput = false;
    for(int a=MAX_LEN*2;a>=0;a--)
    {

        if( bStartOutput)
        {
            printf("%d", result[a]);
        }
    	else if(result[a] ) 
        {
			printf("%d", result[a]);
			bStartOutput = true;    
        }
    }
    if(! bStartOutput )//防止乘积为0
		printf("0");
    printf("\n");
	return 0;
}

你可能感兴趣的:(算法题目,百炼OJ刷题)