首页 > 其他分享 >高精度减法

高精度减法

时间:2024-09-04 09:55:22浏览次数:3  
标签:num1 高精度 int str2 str1 len 字符串 减法

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

using namespace std;

/*
比较两个字符串的大小,并确保第一个字符串大于等于第二个字符串
入参:两个字符串的引用
如果第二个字符串比第一个字符串小,两个字符串进行对换
*/
void cmpAndSwap(string &str1, string &str2);

/*
将str字符串逐字符逆序存入到nums数组中,nums长度必须大于等于str长度
str : 需要被转换的字符串
nums : 存储数字的数组
len : nums数组的长度,填充0的时候需要用
*/
void strToIntArr(string str, int nums[], int len);

/*
按顺序打印数组元素
flag为true时正序打印
flag为false时倒序打印
*/
template <typename T>
void show(T arr[], int len, bool flag=true);

int main()
{
	string str1, str2;
	cin >> str1 >> str2;

	// 比较并交换,确保第一个字符串比第二个字符串大
	cmpAndSwap(str1, str2);

	// 确定数字数组的长度,通过cmpAndSwap已经确保str1长度比str2长,直接使用str1长度即可
	int len = str1.length();
	
	// 创建存储被减数、减数和差的数组
	int num1[len], num2[len], num3[len];
	
	// 将str1和str2字符串分别逐字符逆序存入str1和str2
	strToIntArr(str1, num1, len);
	strToIntArr(str2, num2, len);
	
	// 减法
	for(int i=0;i<len;i++)
	{
		/*
		判断对应位置的被减数是否比减数小
			如果小,则被减数+1位置的值-1,然后当前位置值+10
		执行减法,结果存入num3对应位置
		*/
		if(num2[i] > num1[i]){
			num1[i+1]--;
			num1[i] += 10;
		}
		num3[i] = num1[i] - num2[i];
	}
	
	// 如果num3数组中最后一位为0,len-1
	if(num3[len-1] == 0) len--;
	
	show(num3, len, false);
	
	return 0;
}

/*
比较两个字符串的大小,并确保第一个字符串大于等于第二个字符串
入参:两个字符串的引用
如果第二个字符串比第一个字符串小,两个字符串进行对换
*/
void cmpAndSwap(string &str1, string &str2)
{
	/*
	需要对换的情况:
	1、第二个字符串长度比第一个字符串长
	2、长度相同,但第二个字符串比第一个字符串大
	*/
	if(str1.length()<str2.length() || (str1.length()==str2.length() && str1<str2))
	{
		string temp = str1;
		str1 = str2;
		str2 = temp;
	}
}

/*
将str字符串逐字符逆序存入到nums数组中,nums长度必须大于等于str长度
str : 需要被转换的字符串
nums : 存储数字的数组
len : nums数组的长度,填充0的时候需要用
*/
void strToIntArr(string str, int nums[], int len)
{	
	// 数组数据填充为0
	// memset第三个参数为需要填充的字符数,计算应为每个int类型的所占字符数 * int数组的长度
	memset(nums, 0, sizeof(int)*len);
	// 确定str字符串长度,用于for循环
	int len1 = str.length();
	// 数据填充
	for(int i=0;i<str.length();i++) nums[i] = str[len1-i-1] - 48;
}

/*
按顺序打印数组元素
flag为true时正序打印
flag为false时倒序打印
*/
template <typename T>
void show(T arr[], int len, bool flag)
{
    if(flag)    // 正序打印
        for(int i=0;i<len;i++)
            cout << arr[i];
    else        // 逆序打印
        for(int i=len-1;i>=0;i--)
            cout << arr[i];
    cout << endl;
}

  

标签:num1,高精度,int,str2,str1,len,字符串,减法
From: https://www.cnblogs.com/exception999/p/18395882

相关文章

  • 高精度加法
    #include<iostream>#include<string>#include<cstring>usingnamespacestd;/*按顺序打印数组元素flag为true时正序打印flag为false时倒序打印*/template<typenameT>voidshow(Tarr[],intlen,boolflag=true){ if(flag) //正序打印 for(inti=0;i<......
  • 微型直线导轨高精度运行的工作原理
    微型导轨是一种用于高精度定位和运动控制的传动装置,常用于微小化、高精密度化的机械设备中,如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Ytable,以及高速皮带驱动的设备等小型化设备。微型导轨的构成相对复杂且精密,主要由导轨体、滑块、滚动体、返......
  • 高精度加法心得体会
        高精度加法是基于我们计算加法而设计的一种算法,在C++中我们创建的整数位数不能过大,当我们有大整数计算需求时,就要用到这个算法。 #include<iostream>#include<vector>usingnamespacestd;vector<int>add(vector<int>&A,vector<int>&B)//主体函数的功能是S......
  • 一种基于YOLOv10的高精度光伏板缺陷检测算法(原创自研),适用缺陷检测场景、小缺陷场景
     ......
  • 做减法
       身边上一位全国来回奔波的是某位做公考老师的朋友,她在经历半年频繁出差的生活节奏之后,就辞职过起了养猫种菜的生活。   两个月前6月14日,我从家乡出发内陆来到沿海地区,跟自己说的是“做减法”。什么叫做“做减法”,身外之物越少越好。在郊区住前一家不咋地的公司提......
  • 高精度,强扭矩,舵机让每一次转动都精准无误!
    深入探索科技的前沿,我们不得不聚焦于一款革新性的动力核心——高精度、强扭矩的舵机。这项技术杰作,以其精湛的工艺与尖端的技术,重新定义了精密控制的新标准,无论是翱翔天际的航模,还是穿梭于复杂任务中的机器人手臂,都因它而焕发出前所未有的活力与精准。核心技术解析:高精度舵机......
  • 软硬件全开源智能手表,可全面高精度采集生命体征数据,进行健康检测。(HealthyPi Move)
    HealthyPiMove是一款开放式硬件设备,可让您高精度地跟踪所有生命体征。它不仅仅是另一款带有心率监测器的智能手表,它还是手腕上的完整生命体征监测和记录设备,可以测量心电图(ECG)、光电容积脉搏波(PPG)、SpO₂、血压(基于手指)、EDA/GSR、心率变异性(HRV)、呼吸频率,甚至体温......
  • 加减法| python矩阵运算(学习笔记一)
    python的数学运算部分基本都在使用numpy模块,如果初次使用python,安装该模块最简单的办法就是:搜索框输入cmd打开命令提示符,输入以下代码等待安装即可。pipinstallnumpy如果不确定是否安装好,打开pycharm(此处默认为已经安装该软件),输入以下代码:importnumpyasnp之后即可定......
  • 自动驾驶轻地图 、无地图、高精度地图
    自动驾驶中的轻地图、无地图和高精度地图各有不同的设计原则和应用特点:1.**轻地图**:通常包含基本的道路信息,如车道线和标志。设计原则是平衡地图精度与存储和计算需求。流程包括生成、更新和维护地图数据。原理是用最简化的数据提供足够的导航支持。测试时主要关注地图数据的......
  • 高精度
    #include<cstring>#include<string>#include<algorithm>#include<cmath>#include<iostream>#include<vector>usingnamespacestd;booloperator<(vector<int>a,vector<int>b){if(a.size()!=b.size(......