第五章 高精度运算(C++) 第4课 超级计算机(multiply)《聪明人的游戏 信息学探秘.提高篇》

【例3】高精度乘法。输入两个正整数,求它们的积。

信息学奥赛一本通(C++版)在线评测系统

1.13编程基础之综合应用 09:大整数乘法

OpenJudge - 09:大整数乘法




【问题描述】

    贝贝是学校信息学编程小组的学生,一天,他的数学老师碰到这样一个问题:他想求两个很长的数的乘积,但用普通的计算器无法完成计算,于是他请编程班的贝贝帮忙设计一个“超级计算器”,解决他所遇到的问题。

    请你编一程序,帮贝贝解决这个问题。

【输入格式】

    两行,分别是两个在10100以内的自然数。

【输出格式】

    两数相乘的结果。

【输入样例】

    578474357954668

    12435124571

【输出样例】

    7193400702295541350947428




C++参考代码一:

#include<iostream>
#include<cstring>
#include<cstdio>
char a1[1001],b1[1001];
//string a,b,c;
int a[1001],b[1001],c[1001];
using namespace std;
int main( void )
{
    int lena,lenb,lenc,i,j,x;
    
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    
	cin>>a1>>b1;
    //gets(a1);
    //gets(b1);
    
	lena=strlen(a1);  
    lenb=strlen(b1);
    
	//123 321
	for (i=0;i<=lena-1;i++)   
	{
		a[lena-i]=a1[i]-48;
		//a[lena-i]=a1[i]-'0';
	}
    
	for (i=0;i<=lenb-1;i++)   
	{
		b[lenb-i]=b1[i]-48;//'0'
	}
	
	for (i=1;i<=lena;i++)
	{
		//用于存放进位
	    x=0;                                               
		//对乘数的每一位进行处理
		for (j=1;j<=lenb;j++)                     
	    {
		   //当前乘积+上次乘积进位+原数
		   c[i+j-1]=a[i]*b[j]+x+c[i+j-1]; 
		   x=c[i+j-1]/10;
		   c[i+j-1]%=10;
	    } 
	    
		//进位
		c[i+lenb]=x;                                  
	}
	
	lenc=lena+lenb;
	
	//删除前导0
	while (c[lenc]==0 && lenc>1) 
	{
		lenc--;
	}      
		
	for (i=lenc;i>=1;i--)
	{
		cout<<c[i];
	}	
	//cout<<endl;
	
	return 0;
}


C++参考代码二:

//program p5_04
/*
1307:【例1.3】高精度乘法 AC
http://ybt.ssoier.cn:8088/problem_show.php?pid=1307
*/
#include <bits/stdc++.h>
using namespace std;
const int maxL=200+90;
string s;
int lena,lenb,lenc;
int a[maxL],b[maxL],c[maxL];
void multiply(int a[],int lenax,int b[],int lenbx,int c[],int& lencx)
{
	memset(c,0,sizeof(c));
	
	lencx=lenax+lenbx;
	
	for(int i=0;i<lenax;++i)
	for(int j=0;j<lenbx;++j)
	{
		int w=i+j;
		c[w]+=a[i]*b[j];//此处有问题 
		
		//向前进位 
		c[w+1]+=c[w]/10; 
		
		//cout<<"w1="<<w<<" "<<c[w]<<" "<<c[w+1]<<" "<<w+1<<endl;
		
		//向前进一位之后余下的数 
		c[w]%=10;
		
		//cout<<"w2="<<w<<" "<<c[w]<<endl;
		//cout<<"----------------------------"<<endl;
	}
	
	//去掉前导0 
	while( lencx>1 && c[lencx-1] == 0 )	--lencx;
}
int main( void )
{
	cin>>s;
	lena=s.length();
	
	//倒序 
	for(int i=0;i<lena;++i)
	{
		a[i]=s[lena-1-i]-'0';
	}
	
	cin>>s;
	lenb=s.length();
	//倒序
	for(int i=0;i<lenb;++i)
	{
		b[i]=s[lenb-1-i]-'0';
	}
	
	multiply(a,lena,b,lenb,c,lenc);
	
	for(int i=lenc-1;i>=0;--i)
	{
		cout<<c[i];
	}
	cout<<endl;
	
	return 0;
}
/*
作业: 
1174:大整数乘法
http://ybt.ssoier.cn:8088/problem_show.php?pid=1174

NOIP 2011 普及组初赛试题完善程序 4.2 大整数开方
NOIP 2011 提高组初赛试题完善程序 5.1 大整数开方
https://blog.csdn.net/cool99781/article/details/115642719
*/ 








1168:大整数加法

信息学奥赛一本通(C++版)在线评测系统

1.6编程基础之一维数组_10大整数加法

OpenJudge - 10:大整数加法

1169:大整数减法

信息学奥赛一本通(C++版)在线评测系统

1.6编程基础之一维数组_11大整数减法

OpenJudge - 11:大整数减法

1.6编程基础之一维数组_12计算2的N次方

OpenJudge - 12:计算2的N次方

1.6编程基础之一维数组_13大整数的因子

OpenJudge - 13:大整数的因子

1.6编程基础之一维数组_14求10000以内n的阶乘

OpenJudge - 14:求10000以内n的阶乘

1.6编程基础之一维数组_15阶乘和

OpenJudge - 15:阶乘和

【例 1.6】回文数(Noip1999)

信息学奥赛一本通(C++版)在线评测系统




NOIP2003 普及组 第 4 题 P1045 麦森数(分治、高精度运算)

[NOIP2003 普及组] 麦森数 - 洛谷

NOIP2005 普及组 第 4 题 P1050 循环(高精度运算、数论、快速幂)

[NOIP2005 普及组] 循环 - 洛谷

1307:【例1.3】高精度乘法

信息学奥赛一本通(C++版)在线评测系统

1308:【例1.5】高精除

信息学奥赛一本通(C++版)在线评测系统

1309:【例1.6】回文数(Noip1999)

信息学奥赛一本通(C++版)在线评测系统

1170:计算2的N次方

信息学奥赛一本通(C++版)在线评测系统

1171:大整数的因子

信息学奥赛一本通(C++版)在线评测系统

1172:求10000以内n的阶乘

信息学奥赛一本通(C++版)在线评测系统

1173:阶乘和

信息学奥赛一本通(C++版)在线评测系统

1174:大整数乘法

信息学奥赛一本通(C++版)在线评测系统

1175:除以13

信息学奥赛一本通(C++版)在线评测系统

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值