广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++高精度算法的使用场景详解
  • 361
分享到

C++高精度算法的使用场景详解

2024-04-02 19:04:59 361人浏览 泡泡鱼
摘要

目录描述1. 高精度加法1. 思路2. 代码2. 高精度减法1. 思路2. 代码3. 如果出现被减数的位数小于减数时呢描述 如果要计算的数超过了long long怎么解决? &mda

描述

如果要计算的数超过了long long怎么解决? —>使用高精度加减乘除,简单理解就是 很大的数进行加减乘除。

1. 高精度加法

1. 思路

  • 创建对应的数组变量及其他变量
  • 输入字符串
  • 将读入的数据转化为整数类型,并逆序(反转)存储到数组中
  • 将两个数组做累加(注意进位)
  • 判断最高位是否为0,大于0代表进位了,则让长度加1
  • 倒序输出

2. 代码

#include<bits/stdc++.h>
using namespace std;
int a[510], b[510], c[510];//a:被加数  b:加数  c:和 
int main(){
	// 1. 输入字符串 
    string str1,str2;
    cin >> str1 >> str2;
    // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}
    for (int i = 0; i < str1.size(); i ++)
        a[str1.size()-1 - i] = str1[i] - '0';
    for (int i = 0; i < str2.size(); i ++)
        b[str2.size()-1 - i] = str2[i] - '0';  
	// 3. 找两个字符串最大的个数,目的是为了将每一位计算完 
    int ans = max(str1.size(), str2.size());
    // 4. 相加(a+b) 
    for (int i = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算 
        c[i] += a[i] + b[i];//相加 
        c[i+1] = c[i] / 10;// 进位 
        c[i] %= 10;//将加的结果求余10 得出第i位 
    }
    //4. 如果结果数组第ans位的数大于0(大于0代表进位了),则让长度增加1 
    while(c[ans]>0) ans++;  
    //5. 倒序输出 
    for (int i = ans-1; i >= 0; i--)
        cout << c[i];
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:加数1  b:加数2  c:进位数组  ans:结果数组 
int main(){
	// 1. 输入字符串 
    string str1,str2;
    cin >> str1 >> str2;
	len_a = str1.length();
	len_b = str2.length();
    // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}
    for (int i = 0; i < str1.size(); i ++)
        a[str1.size()-1 - i] = str1[i] - '0';
    for (int i = 0; i < str2.size(); i ++)
        b[str2.size()-1 - i] = str2[i] - '0';  
	// 3. 找两个字符串最大的个数,目的是为了将每一位计算完 
	len_ans = max(len_a,len_b);
	// 4. 相加(a+b) 
	for(int i=0;i<=len_ans;i++){
		ans[i] = a[i] + b[i] + c[i];//结果数组 =(等于) 被加数 加上  加数 加上 进位的数  
		if(ans[i] > 9){//如果结果数组大于9,则进位 
			c[i+1] = ans[i] / 10;//给进位数组赋值 
			ans[i] %= 10; // 让结果数组大于9的数求余10,变成个位数 
		}
	} 
	//5. 如果结果数组len_ans位的数大于0,则让长度增加1 
	while(ans[len_ans]>0) len_ans++;
	//6. 倒叙输出 
	for(int i=len_ans-1;i>=0;i--) cout<<ans[i];
	return 0;
}

2. 高精度减法

1. 思路

  • 定义被减数a,减数b,结果c数组
  • 输入被减数和减数,并且将数据倒叙存入数组中。
  • 找两个字符串最大的个数,目的是为了将每一位计算完
  • 将两个数组做相减(遍历至最大长度,避免有的数字没计算 )。
  • 去掉前导 0 。例如结果为:089,不需要0
  • 循环遍历输出

2. 代码

#include<bits/stdc++.h>
using namespace std;
int a[510], b[510], c[510];//a:被减数  b:减数  c:结果 
int main(){
	// 1. 输入字符串 
    string str1,str2;
    cin >> str1 >> str2;
    // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}
    for (int i = 0; i < str1.size(); i ++)
        a[str1.size()-1 - i] = str1[i] - '0';
    for (int i = 0; i < str2.size(); i ++)
        b[str2.size()-1 - i] = str2[i] - '0';  
	// 3. 找两个字符串最大的个数,目的是为了将每一位计算完 
    int ans = max(str1.size(), str2.size());
    // 4. 相减(a-b) 
    for (int i = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算 
    	if(a[i] < b[i]){
        	a[i+1] -= 1;//向前借一位 
        	a[i] += 10;// 借一位以后加10 
		} 
        c[i] = a[i] - b[i]; 
    }
    //5. 如去掉前导 0 。例如结果为:089,不需要0
    while(c[ans-1]==0 && ans>1) ans--;  
    //6. 倒序输出 
    for (int i = ans-1; i >= 0; i--)
        cout << c[i];
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:被减数  b:减数  c:进位  ans:结果 
int main(){
	// 1. 输入字符串 
    string str1,str2;
    cin >> str1 >> str2;
	len_a = str1.length();
	len_b = str2.length(); 
    // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}
    for (int i = 0; i < str1.size(); i ++)
        a[str1.size()-1 - i] = str1[i] - '0';
    for (int i = 0; i < str2.size(); i ++)
        b[str2.size()-1 - i] = str2[i] - '0';  
	// 3. 找两个字符串最大的个数,目的是为了将每一位计算完 
	len_ans = max(len_a,len_b);
	// 4. 相减(a-b)
	for(int i=0;i<=len_ans;i++){
		ans[i] = a[i] - b[i] - c[i];//结果数组 =(等于) 被减数 减去  减数  减去 进位的数  
		if(ans[i] < 0){//如果结果数组小于0,则借位 
			ans[i] += 10;// 借1位,加上10 
			c[i+1]++;    // 进位数组加1 
		}
	} 
	//5. 如去掉前导 0 。例如结果为:089,不需要0
	while(len_ans>1 && ans[len_ans-1]==0) len_ans--;
	//6. 倒序输出 
	for(int i=len_ans-1;i>=0;i--) cout<<ans[i];
	return 0;
}

3. 如果出现被减数的位数小于减数时呢

#include<bits/stdc++.h>
using namespace std;
int a[510], b[510], c[510];//a:被减数  b:减数   c:结果 
int flag = 0;
int main(){
	// 1. 输入字符串 
    string str1,str2;
    cin >> str1 >> str2;
    //2. str1.size() < str2.size() 或者 两个数一样长并且被减数的数值小于减数时,才需要交换两数位置
    if(str1.size() < str2.size() || str1.size() == str2.size() && str1 < str2) {
    	string t = str1;
    	str1 = str2;
    	str2 = t;
    	flag = 1;
	}
    // 3. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}
    for (int i = 0; i < str1.size(); i ++)
        a[str1.size()-1 - i] = str1[i] - '0';
    for (int i = 0; i < str2.size(); i ++)
        b[str2.size()-1 - i] = str2[i] - '0';  
	// 4. 找两个字符串最大的个数,目的是为了将每一位计算完 
    int ans = max(str1.size(), str2.size());
    // 5. 相减(a-b) 
    for (int i = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算 
    	if(a[i] < b[i]){
        	a[i+1] -= 1;//向前借一位 
        	a[i] += 10;// 借一位以后加10 
    	}
		c[i] = a[i] - b[i]; 
    }
    //6.如去掉前导 0 。例如结果为:089,不需要0
    while(c[ans-1]==0 && ans>1) ans--;  
    //7. 倒叙输出 
    if(flag == 1) cout<<"-";
    for (int i = ans-1; i >= 0; i--)
        cout << c[i];
    return 0;
}

到此这篇关于C++高精度算法的使用场景详解的文章就介绍到这了,更多相关C++高精度算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++高精度算法的使用场景详解

本文链接: https://www.lsjlt.com/news/167266.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作