高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

2024-09-08 01:28

本文主要是介绍高精度计算(代码加解析,洛谷p1601,p1303)除法待更新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

高精度加法

高精度减法

高精度乘法


高精度加法

我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。

  8 5 6
+ 2 5 5
-------
1 1 1 1

加法进位:

c[i] = a[i] + b[i];
if(c[i] >= 10){c[i] %= 10;c[i+1]++;
}

按位相加求和:

    int len = s1.length();int carry = 0;for(int i = len-1; i >= 0; i--){int tmp = s1[i] - '0' + s2[i] - '0' + carry;carry = tmp/10;tmp %= 10;ret = char(tmp + '0') + ret;}if(carry != 0) ret = char(carry + '0') + ret;

 完整代码:

#include<iostream>
#include<string>
using namespace std;int main()
{string s1,s2,ret;cin >> s1 >> s2;int len1 = s1.length();int len2 = s2.length();// 不论s1,s2谁短,高位补0补到一样长if(len1<len2){for(int i=1;i<=len2-len1;i++)s1="0"+s1;}else{for(int i=1;i<=len1-len2;i++)s2="0"+s2;}int len = s1.length();  //得到两个字符串的长度int carry = 0;  // 记录进位// i从字符串最后一位向前走,也就是从两个数的个位向高位走for(int i = len-1; i >= 0; i--){// 相当于c[i] = a[i] + b[i],如果c[i]>=10, c[i]%=10, c[i+1]++;int tmp = s1[i] - '0' + s2[i] - '0' + carry; //字符转换成数字,要-'0'carry = tmp/10;tmp %= 10;ret = char(tmp + '0') + ret; //把每个新位放到原字符串前面}//如果carry位不等于0,则表明两个数的最高位相加还有进位if(carry != 0) ret = char(carry + '0') + ret;  cout << ret;
}

高精度减法

类似加法,也可以用竖式求解。需要注意的是,被减数必须比减数大,同时需要处理借位。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{int a[256],b[256],c[256],lena,lenb,lenc,i;char n[256],n1[256],n2[256];memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));printf("Input minuend:");	gets(n1);printf("Input subtrahend:");	gets(n2);if(strlen(n1) < strlen(n2) || (strlen(n1) == strlen(n2) && strcmp(n1,n2) < 0)){strcpy(n,n1);strcpy(n1,n2);strcpy(n2,n);cout << "-"; 	//因为交换了减数和被减数,结果为负数 }lena = strlen(n1);lenb = strlen(n2);for(i = 0; i <= lena-1; i++) a[lena-i] = int(n1[i] - '0');	//被减数放入a数组 for(i = 0; i <= lenb-1; i++) b[lenb-i] = int(n2[i] - '0');	//减数放入b数组i= 1;while(i <= lena || i <= lenb){if(a[i] < b[i]){a[i]+=10;	//高位借1 a[i+1]--;}c[i] = a[i] - b[i];	//对应位相减i++; } lenc = i;while(c[lenc] == 0 && lenc > 1) lenc--;	//最高位0不输出for(i = lenc; i >= 1; i--) cout << c[i];cout << endl;return 0; 
}

高精度乘法

类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位。同时对每一位进行乘法运算时,必须进行错位相加。

     8  5  6
*       2  5 
----------------4  2  8  0
1 7  1  2
----------------
2 1  4  0  0
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{char a1[101],b1[101];int a[101],b[101],c[10001],lena,lenb,lenc,i,j,x;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));scanf("%s",a1);scanf("%s",b1);lena = strlen(a1); lenb = strlen(b1);for(i = 0; i <= lena-1; i++) a[lena-i] = int(a1[i] - 48);	for(i = 0; i <= lenb-1; i++) b[lenb-i] = int(b1[i] - 48);	for(i = 1; i <= lena; i++){x = 0;for(j = 1; j <= lenb; j++){c[i+j-1] += a[i]*b[j] + x;	//当前乘机+上次乘机进位+原数 x = c[i+j-1] / 10;c[i+j-1] %= 10;}c[i+lenb] = x;	//进位 } lenc = lena + lenb;while(c[lenc] == 0 && lenc > 1)	lenc--;	//删除前导0 for(i = lenc; i > 0; i--) cout << c[i];cout << endl; return 0; 
}

还有一种思路,把每一位的乘积和加起来先不做处理。最后再去处理计算进位。

        7    8    9
*            2    3
----------------------21   24    2714   16   18
----------------------14   37   42    271 (1) 8 (4) 1 (4) 4 (2) 7

这篇关于高精度计算(代码加解析,洛谷p1601,p1303)除法待更新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146721

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -