首页 > 编程语言 >C++高精度乘法

C++高精度乘法

时间:2024-09-05 10:27:43浏览次数:4  
标签:高精度 int str2 str1 999 C++ include 乘法

#include <iostream>
#include <string>
#include <cstring>

using namespace std;
 
int main()
{
    string str1, str2;
    cin >> str1 >> str2;
 	
 	// 确定字符串长度
 	int len1 = str1.length();
 	int len2 = str2.length();
 	
 	// 确认积数组的长度
 	// 积的长度上限推断:999*99的大小不会超过999*100(999补两个0即加两位),也即len3<=len1+len2
 	int len3 = len1 + len2;
 	
 	// 创建存储数据的int数组
 	// num1:乘数1数组,num2:乘数2数组,num3:积数组
 	int num1[len1], num2[len2], num3[len3];
 	
 	// 数组数据全部置为0
 	memset(num1, 0, sizeof(num1));
 	memset(num2, 0, sizeof(num2));
 	memset(num3, 0, sizeof(num3));
 	
 	// 乘数数据的逆序填充
 	for(int i=0;i<len1;i++) num1[i] = str1[len1-i-1] - 48;
 	for(int i=0;i<len2;i++) num2[i] = str2[len2-i-1] - 48;
 	
 	// 计算乘法,分别遍历两个乘数,边乘边将结果存入到积相对应的位置处理
	// 进行遍历相乘时,根据竖式推导可知num1[i]*num2[j]的值会被放到num3的i+j位置上
 	// x为进位值,存入到num3中后需取余并设定进位
 	int x = 0;
 	for(int i=0;i<len1;i++)
 	{
 		for(int j=0;j<len2;j++)
 		{
 			// 计算乘数,注意用+=,因为i+j位置在两层循环中有可能被重复赋值
 			num3[i+j] += num1[i] * num2[j] + x;
 			// 向上进位
 			num3[i+j+1] += num3[i+j] / 10;
 			// 取余
 			num3[i+j] %= 10;
		}
	}
	
	// 判断最后num3最后一位是否为0,为0则len3--以去除多余的高位
	if(num3[len3-1]==0) len3--;
	
	// 逆序打印结果
	for(int i=len3-1;i>=0;i) cout << num3[i];
	cout << endl;
 	
    return 0;
}

  

标签:高精度,int,str2,str1,999,C++,include,乘法
From: https://www.cnblogs.com/exception999/p/18397852

相关文章

  • 编译原理项目——C++实现C语言编译器输出为gcc级汇编(代码/报告材料)
    完整的代码材料见文章末尾以下为核心内容和部分结果项目介绍function.cpp实现了共有的函数lexer.cpp词法分析器get_predict_table.cpp获取预测分析表LR.cpp语法分析generate.cpp语义分析中间代码生成to_asm.cpp目标代码生成部分核心代码LR分析#include"co......
  • 【C++】封装
    目录1.访问控制符2.封装的目的2.1.数据隐藏和保护2.2.接口与实现的分离2.3.控制访问3.封装的好处3.1.提高代码的安全性3.2.减少错误3.3.提高代码的可维护性3.4.增强代码的可读性3.5.促进模块化设计3.6.提高代码的可重用性3.7.支持面向对象的设计原则......
  • 人脸静态活体检测(高精度版) API 对接说明
    人脸静态活体检测(高精度版)API对接说明本文将介绍人脸静态活体检测(高精度版)API对接说明,它可用于对用户上传的静态图片进行防翻拍活体检测,以判断是否是翻拍图片。接下来介绍下人脸静态活体检测(高精度版)API的对接说明。申请流程要使用API,需要先到人脸静态活体检测(......
  • VScode「配置自动代码格式化C/C++」
    前言        你好,我是小莱,希望输出高质量的内容。        在大厂实习的过程中,我发现很多资深的开发者都习惯自己敲空格,按照公司的代码规范使用标尺来提示自己什么时候该换行。也许这样做可以增加代码编辑时的灵活性,但对于新入职场(用惯了VS)的小白来说,无疑大......
  • 《C++中的反射机制:开启高级编程之门》
    一、引言在现代编程中,反射机制是一种强大的工具,它允许程序在运行时检查和操作对象的结构和行为。虽然C++语言本身并没有内置的反射机制,但通过一些技巧和技术,我们可以在C++中实现类似的功能。本文将深入探讨如何在C++中实现反射机制,以及它在实际编程中的应用。二、什么......
  • 《C++中的移动构造函数与移动赋值运算符:高效编程的利器》
    一、引言在C++编程中,随着现代软件对性能要求的不断提高,高效地管理资源变得至关重要。C++11引入了移动语义,其中移动构造函数和移动赋值运算符成为了提高程序性能和资源管理效率的重要工具。本文将深入探讨C++中的移动构造函数和移动赋值运算符的作用,以及它们在实际编程中......
  • Win32 C++代码快速验证模板
    DLL模板#include<windows.h>#include<algorithm>#include<array>#include<cstdio>#include<cstdlib>#include<cstring>#include<deque>#include<iostream>#include<list>#include<map>#incl......
  • 6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)
    目录一.堆(Heap)的基本介绍二.堆的常用操作(以小根堆为例)三.实现代码3.1堆结构定义3.2向下调整算法*3.3初始化堆*3.4销毁堆3.4向上调整算法* 3.5插入数据3.6删除数据3.7返回堆顶数据四.下篇内容1.堆排序2.TopK问题一.堆(Heap)的基本介绍    ......
  • 面向对象程序设计之链表 list 的简析(C++)
    简介:链表是一个双向的结构,与string与vector不同的是他不支持[]访问,因为链表是由一个节点一个节点连接而成的,并不连续。我们可以在常数量级内对于链表进行插入与删除数据1.构造函数我们在cplusplus.com中可以查到链表总共有四种构造的方式:1.无参构造(默认构造);2.使用n个va......
  • 深入了解链表 list 之的模拟实现 list (C++)
    1.基本框架关于链表我们知道其是一个双向循环结构,并且由许多节点组成,各个节点之间内存空间不一定连续,每个节点均有前驱指针与后继指针,下面我们使用类模版来实现一个适用于存储大部分数据类型的链表,由下面代码我们可以看到一些基础框架与很简单的函数size返回长度与empty判断......