zoukankan      html  css  js  c++  java
  • 一本通1174 高精度乘法

    【题目描述】

    求两个不超过200位的非负整数的积。

    【输入】

    有两行,每行是一个不超过200位的非负整数,没有多余的前导0。

    【输出】

    一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

    【输入样例】

    12345678900
    98765432100
    

    【输出样例】

    1219326311126352690000

    代码


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    int main()
    {
    	char a1[201],b1[201];
    	int a[201]={0},b[201]={0},c[10001]={0},lena,lenb,lenc,i,j,x; 
    	scanf("%s",a1);
    	scanf("%s",b1);
    	lena=strlen(a1),lenb=strlen(b1);
    	for(i=0;i<lena;i++) a[lena-i]=a1[i]-48;
    	for(i=0;i<lenb;i++) b[lenb-i]=b1[i]-48;
    	for(i=1;i<=lena;i++)
    	{
    		x=0;
    		for(int j=1;j<=lenb;j++)
    		{
    			c[i+j-1]=c[i+j-1]+x+a[i]*b[j];//乘法不是对位相乘,而是每一位都要乘,所以要找一下规律,就是第i+j-1位是第i位乘以第j位再加上进的数,这次可不一定只是1了。但是最需要注意的一点是,要加上这位原有的数。
    比如说,一个两位数乘以两位数,那么列竖式计算的时候,结果的第二位实际上是加了两次,所以不能抛弃原来的第一个数 x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lenb]=x; } lenc=lena+lenb;最大也不会超过两个乘数数位的和,比如说99*99,这样结果四位。为什么呢?你看,假设有5位,那么结果必定大于10000,但是即使是99*100,才9900,而99*99已经是每一位都取最大的数了,所以不能超过 while(c[lenc]==0&&lenc>1) lenc--; for(i=lenc;i>=1;i--) cout<<c[i]; return 0; }
  • 相关阅读:
    CSS 的 outline 属性
    CSS3 的 boxsizing 属性
    CSS 颜色的使用
    动态添加tab(ext)
    showModalDialog()重新加载问题
    DBUtility.SQLServerHelper”的类型初始值设定项引发异常
    终于有了思路
    js判断上传的图片格式
    session丢失 frame
    动态添加tab(ext中的treePanel)
  • 原文地址:https://www.cnblogs.com/57xmz/p/12370825.html
Copyright © 2011-2022 走看看