首页 > 其他分享 >T226689 求两个正整数的乘积

T226689 求两个正整数的乘积

时间:2023-04-22 12:55:39浏览次数:39  
标签:lenb lena 正整数 乘积 int T226689 len quad

题目描述

给你两个正整数 \(A\) 和 \(B\),\((1<=A,B<=10^{2000})\)。求 \(A\) 与 \(B\) 的乘积。

输入格式

包括一行,两个正整数\(A\) 和 \(B\),\((1<=A,B<=10^{2000})\)。

输出格式

一行,一个正整数表示乘积。

样例 #1

样例输入 #1

3 7

样例输出 #1

21

代码及其思路

由题A,B两数的范围可达到\(10^{2000}\)这个量级,所以选择使用高精度算法
而高精度算法就是对竖式乘法的模拟
例如:
\(\qquad\quad 2\ 9\ 3\ 4\)
\(\times\quad\quad \ 3\ 4\ 8\ 9\)
\(———————\)
\(\quad\quad\ 2\ 6\ 4\ 0\ 6\)
\(\quad\ \ 2\ 3\ 4\ 7\ 2\ 0\)
\(\ \ \ 1\ 1\ 7\ 3\ 4\ 0\ 0\)
\(\ \ \ 8\ 8\ 0\ 2\ 0\ 0\ 0\)
\(———————\)
\(1\ 0\ 2\ 3\ 6\ 7\ 2\ 6\)
我们的目的就是模拟上述竖式的计算过程

输入处理

由于需要对每一位进行处理,所以以字符串存储每一位然后转换成整型数组方便处理
由于需要以个位对齐,所以转换成整型数组的同时反转数组

高精度过程

进行竖式乘法可以先不考虑进位
显然,竖式计算时需要双重循环,外层循环i为\(B\)(即例中的3489),内层循环j为\(A\)
同时存入答案数组c,有如下公式c[i + j - 1] += a[j] * b[i]
即\(A\)的第j位乘以\(B\)的第i位应存入答案数\(C\)的第i+j-1中,实现错位相加

进位

对答案数组进行循环i,如果第i位数字大于9,先进位后取个位

输出处理

记\(A\),\(B\)位数分别为lena,lenb
由于输入处理时反转了数组,而结果位数不超过两数位数之和即lena+lenb,所以输出时从lena+lenb开始反向输出,同时去除开头多余的0

最后附上代码

#include<iostream>
using namespace std;
int main()
{
	string a1, b1;
	int a[10001] = { 0 }, b[10001] = { 0 }, c[10001] = { 0 };
	cin >> a1 >> b1;//输入字符串
	int lena = a1.length();
	int lenb = b1.length();//记录字符串长度


	for (int i = 1; i <= lena; i++)a[i] = a1[lena - i] - '0';
	for (int i = 1; i <= lenb; i++)b[i] = b1[lenb - i] - '0';
	//转化为整型数组并反转数组
	
	for (int i = 1; i <= lenb; i++)
	{
		for (int j = 1; j <= lena; j++)
		{
			c[i + j - 1] += a[j] * b[i];
		}
	}//竖式乘法计算过程


	for (int i = 1; i < lena + lenb; i++)
	{
		if (c[i] > 9)
		{
			c[i + 1] += c[i] / 10;
			c[i] %= 10;
		}
	}//处理进位


	int len = lena + lenb;
	while (c[len] == 0 && len > 1)len--;//去除多余的0
	for (int i = len; i >= 1; i--)cout << c[i];//输出
	return 0;
}

标签:lenb,lena,正整数,乘积,int,T226689,len,quad
From: https://www.cnblogs.com/114514-1919810/p/17342804.html

相关文章

  • 剑指 Offer II 005. 单词长度的最大乘积
    题目链接:剑指OfferII005.单词长度的最大乘积方法:转化为二进制位+位运算解题思路将\(words[i]\)字符串中包含的字母转换为二进制位上的\(1\),字符'a'对应二进制中的第\(0\)位上的\(1\),这样每个字符串就对应一个二进制数。通过两个字符串的二进制数进行'&'运算,......
  • C语言:求正整数的所有质数因子(如:180:2 2 3 3 5)
    #include<stdio.h>#求正整数的所有质数因子(如:180:22335)main(){intm,i;scanf("%d",&m);for(i=2;i<=m;i++){if(m%i==0){printf("%3d",i);m=m/i;......
  • 最小乘积生成树
    感觉上次写知识点已经是若干年前了。板子是P5540。把生成树的\(\suma,\sumb\)看做坐标\((x,y)\)扔到二维平面上,那么我们就相当于找一个\(x\timesy\)最小的点。这个点显然在凸包上。当然我们不可能把所有点找出来跑凸包。那我们想办法只扫可能成为答案的点,即只找一个凸......
  • 洛谷P1249最大乘积,数论找规律
    最大乘积题目描述一个正整数一般可以分为几个互不相同的自然数的和,如\(3=1+2\),\(4=1+3\),\(5=1+4=2+3\),\(6=1+5=2+4\)。现在你的任务是将指定的正整数\(n\)分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。输入格式只一个正整数\(n\),(\(3\leqn\leq10000\))。......
  • java 递归方法 计算1-100之间的所有自然数的和 计算1-100之间所
    packageprectice;/***递归方法的使用**递归方法的定义:一个方法体内调用他自身**①方法递归包含了一种隐式循环,它会重复执行某段代码,但这种重发执行无须循环控制。*②递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似死循环。** 例1:计......
  • 【剑指 Offer】 66. 构建乘积数组
    【题目】给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B[i]的值是数组A中除了下标i以外的元素的积,即B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入:[1,2,3,4,5]输出:[120,60,40,30,24]来源:力扣(LeetCode)链接:https://leetc......
  • 求任一两个正整数的最大公约数。
    二、设计思路:1、输入两个正整数;2、将两个数中较小的数值赋给temp;3、接着用其中一个数与temp求余,若余数不为0,则temp-1,循环该步骤直到余数为0。4、再用另一个数,重复此步骤,最后得出的值为这两个数的最大公约数。 #include<stdio.h>intmain(){ inti=0; intm,n,temp; printf......
  • 数的乘积
    数的乘积考虑用除法解决这个问题。因为如果这些数的乘积超过了\(10^{18}\),那么用\(10^{18}\)依次除以这些数肯定存在一个时刻变为\(0\)。所以就可以在不使用__int128这类黑科技的情况下方便的判断。注意如果有一个数是\(0\)应该立刻停下输出\(0\),不然可能出现FloatPoi......
  • (5)使用函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇和。输入两个正整数
    #include<stdio.h>#include<math.h>intprime(intm){  inti;  if(m<2)    return0;  for(i=2;i<=sqrt(m);i++){    if(!(m%i))      return0;  }  return1;}intmain(){  intm,n,flag;  printf("Enterm,......
  • 剑指offer66(Java)-构建乘积数组(中等)
    题目:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中 B[i]的值是数组A中除了下标i以外的元素的积,即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。 示例:输入:[1,2,3,4,5]输出:[120,60,40,30,24] 提示:所有元素乘积之和不会......