高精度计算

主页:(*´∇`*) 咦,又好了~ xiaocr_blog


(1)数据的接收方法和存储方法:

当输入的数据很长的时候,可采取字符串方式输入,这样可以输入位数很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。

(2)高精度数位数确定:

位数确定:接收时往往是用字符串的,所以它的位数就等于字符串长度。

(3)高精度除法分为竖式除法还有模拟减法两种

//加法进位 c[i] = a[i] + b[i]
if(c[i]>=10){c[i] %= 10;++c[i+1];}
//减法借位
if(a[i]<b[i]){--a[i+1];a[i]+=10;
     c[i] = a[i] - b[i]  }
//高除低除法储存无需倒置,竖式除法
//高除高为减法模拟除法

#include<bits/stdc++.h>
using namespace std;
int main() {
	char a1[100], b1[100];
	int a[100], b[100], c[100];
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));
	gets_s(a1);
	gets_s(b1);
	int lena = strlen(a1);
	int lenb = strlen(b1);
	for (int i = 0; i <= lena - 1; i++) {
		a[lena - i] = a1[i] - '0';
	}
	for (int i = 0; i <= lenb - 1; i++) {
		b[lenb - i] = b1[i] - '0';
	}
	int lenc = 1;
	int x = 0;
	while (lenc <= lena || lenc <= lenb) {
		c[lenc] = a[lenc] + b[lenc]+x;
		x = c[lenc] / 10;
		c[lenc] %= 10;
		lenc++;
	}
	c[lenc] = x;
	if (c[lenc] == 0) {//处理最高位
		lenc--;
	}
	for (int i = lenc; i >= 1; i--) {
		cout << c[i];
	}
	return 0;
}
#include<bits\stdc++.h>
using namespace std;
int main() {
	char a1[100], b1[100],q[100];
	int a[100], b[100], c[100];
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));
	gets(a1);gets(b1); 
	if (strlen(a1) < strlen(b1) || (strlen(a1) == strlen(b1)&&strcmp(a1, b1) < 0)) {
		strcpy(q, a1);
		strcpy(a1, b1);
		strcpy(b1, q);
		cout << "-";
	}
	int lena = strlen(a1);
	int lenb = strlen(b1);
	for (int i = 0; i <= lena - 1; i++) {
		a[lena - i] = a1[i] - '0';
	}
	for (int i = 0; i <= lenb - 1; i++) {
		b[lenb - i] = b1[i] - '0';
	}
	int lenc = 1;
	while (lenc <= lena || lenc <= lenb) {
		if (a[lenc] < b[lenc]) {
		 a[lenc] += 10;	
		 a[lenc + 1]--;
		}
			c[lenc] = a[lenc] - b[lenc];
		lenc++;
	}
	lenc--;
	while ((c[lenc] == 0) && (lenc > 1)) {
		lenc--;
	}
	for (int i = lenc; i >= 1; i--) {
		cout << c[i];
	}
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
	char a1[101],b1[101];
	int a[101],b[101],c[101];
	int lena,lenb,lenc;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	gets(a1),gets(b1); 
	lena = strlen(a1);lenb = strlen(b1);
	for(int i =0;i<=lena-1;i++){
		a[lena-i] = a1[i] - '0';
	}
	for(int i =0;i<=lenb-1;i++){
		b[lenb-i] = b1[i] - '0';
	}
	for(int i =1;i<=lena;i++){
		for(int j =1;j<=lenb;j++){
			c[i+j-1] += a[i]*b[j];
			c[i+j] += c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
	lenc = lena + lenb;
	if(c[lenc]==0&&lenc>=1){
		lenc--;
	}
	for(int i =lenc;i>=1;i--){
		cout<<c[i];
	}
	return 0;
} 
#include<bits/stdc++.h>
using namespace std;
char a1[101];
int a[101],c[101],x;
long long b;
int main(){
	cin>>a1>>b;
	int lena = strlen(a1);
	for(int i =1;i<=lena;i++)
	{
		a[i] = a1[i-1] - '0';
	}
	for(int i=1;i<=lena;i++){
		c[i] = (10*x+a[i])/b;
		x = (10*x+a[i])%b;
	}
	int lenc =1;
	while(c[lenc]==0&&lenc<lena){
		lenc++;
	}
	for(int i = lenc;i<=lena;i++){
		cout<<c[i];
	}
	
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[101], b[101], c[101];
void init(int a[]) {
	char st[101];
	cin >> st;
	a[0] = strlen(st);
	for (int i = 1; i <= a[0]; i++) {
		a[i] = st[a[0]-i] - '0';
	}
}
void output(int a[]) {
	if (a[0] == 0) {
		cout << 0;
		return;
	}
	for (int i = a[0]; i >= 1; i--) {
		cout << a[i];
	}
}
int compare(int a[], int b[]) {
	if (a[0] > b[0]) return 1;
	if (a[0] < b[0]) return -1;
	for (int i = a[0]; i >= 1; i--) {
		if (a[i] > b[i]) return 1;
		if (a[i] < b[i]) return -1;
	}
	return 0;
}
void minus_(int a[], int b[]) {
	int flag;
	flag = compare(a, b);
	if (flag == 0) {
		a[0] = 0;
		return;
	}
	if (flag == 1) {
		for (int i = 1; i <= a[0]; i++) {
			if (a[i] < b[i]) {
				a[i + 1]--; a[i] += 10;
			}
			a[i] -= b[i];
		}
		while (a[a[0]] == 0 && a[0] > 0) {
			a[0]--;
		}
		return;
	}
}
void numcpy(int p[], int q[], int det) {
	for (int i = 1; i <= p[0]; i++) {
		q[i + det - 1] = p[i];
		q[0] = p[0] + det - 1;
	}
}
void chuGao(int a[], int b[], int c[]) {
	int tem[101];
	c[0] = a[0] - b[0] + 1;

	for (int i = c[0]; i >= 1; i--) {
		memset(tem, 0, sizeof(tem));
		numcpy(b, tem, i);
		while (compare(a, tem) > 0) {
			c[i]++;
			minus_(a, tem);
		}

	}
	while (c[0] > 0 && c[c[0]] == 0) {
		c[0]--;
	}
	return;
}
int main() {
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	init(a), init(b);
	chuGao(a, b, c);
	output(c);

	return 0;
}

1.大整数的加法

#include<bits/stdc++.h>
using namespace std;
char a1[101], b1[101];
int a[101], b[101], c[101];
int lena, lenb, lenc;
int main() {
	cin >> a1 >> b1;
	lena = strlen(a1); lenb = strlen(b1);
	for (int i = 0; i <= lena - 1; i++) {
		a[lena - i] = a1[i] - '0';
	}
	for (int i = 0; i <= lenb - 1; i++) {
		b[lenb - i] = b1[i] - '0';
	}
	lenc = 1;
	while (lenc <= lena || lenc <= lena) {
		lenc++;
	}
	int x = 0;
	for (int i = 1; i <= lenc; i++) {
		c[i] = a[i] + b[i] + x;
		x = c[i] / 10;
		c[i] %= 10;
	}
	while (c[lenc] == 0 && lenc > 0) {
		lenc--;
	}
	for (int i = lenc; i >=1; i--) {
		cout << c[i];
	}

	return 0;
}

2.给定一个整数,计算2的N次方

#include<bits/stdc++.h>
using namespace std;
int a[1001];
int N;
int main() {
	a[1] = 1;
	cin >> N;
	int k = 1,x=0;
	for (int j = 1; j <= N; j++) {
		 x = 0;
		for (int i = 1; i <= k; i++) {
			a[i] = a[i] * 2 + x;
			x = a[i] / 10;
			a[i] %= 10;
			if (x != 0 && i == k) {
				k++;
				//伸缩
			}
		}
	}
	for (int i = k; i >= 1; i--) {
		cout << a[i];
	}
	return 0;
}

3.大整数的因子

#include<bits/stdc++.h>
using namespace std;
char a1[101];
int a[101], c[101], lena,b, x;
int main() {
	cin >> a1;
	lena = strlen(a1);
	for (int i = 1; i <= lena; i++) {
		a[i] = a1[i - 1] - '0';
	}
	for (int i = 2; i <= 9; i++) {
		x = 0;
		for (int j = 1; j <= lena; j++) {
			c[j] = (a[j] + x * 10) / i;
			x = (10 * x + a[j]) % i;
		}
		if (x % i == 0) {
			cout << i << " ";
		}
	}


	return 0;
}

4.*10000以内n的阶乘

#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001];
int main(){
	int n,fac,k=1;
	cin>>n;
	a[1] = 1;
	for(int i =1;i<=n;i++){
		for(int j =1;j<=k;j++){
			a[j] = a[j]*i;
			a[j]= a[j-1]/10+a[j];
			a[j-1] = a[j-1]%10;
			if(a[j]>=10&&j>=k){
				k++;
			}
		}
	}
	for(int i =k;i>=1;i--){
		cout<<a[i];
	}
	return 0;
}


5*.高精度计算之阶乘和

#include<bits/stdc++.h>
using namespace std;
int a[10001], sum[10001], n;
void getsum(int a[], int b[]) {
	int tem[10001] = { 0 };
	int x = 0;
	for (int i = 1; i <= 10001; i++) {
		tem[i] = a[i] + b[i] + x;
		x = tem[i] / 10;
		tem[i] %= 10;
	}
	for (int i = 1; i <= 10001; i++) {
		b[i] = tem[i];
	}
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		memset(sum, 0, sizeof(sum));
		a[1] = 1; int k = 1;
		for (int j = 1; j <= i; j++) {
			for (int p = 1; p <= k; p++) {
				a[p] = a[p] * j;
				a[p] = a[p - 1] / 10 + a[p];
				a[p - 1] = a[p - 1] % 10;
				if (a[p] >= 10 && p >= k) {
					k++;
				}
			}
		}
		getsum(a, sum);
	}
	int t = 10001;
	while (sum[t] == 0) {
		t--;
	}
	for (int i = t; i >= 1; i--) {
		cout << sum[i];
	}

	return 0;
}
#include<stdio.h>
#define N 10000 
int main()
{
	int i, j, x, k, n, b[N] = { 0 };
	scanf("%d", &n);
	for (k = 1; k <= n; k++)
	{
		int a[N] = { 0 };
		a[9999] = 1;
		for (i = 1, x = 0; i <= k; i++) {
			for (j = 9999; j >= 0; j--)
			{
				a[j] = a[j] * i + x;
				x = a[j] / 10;
				a[j] = a[j] % 10;
			}
		}
		for (j = 9999; j >= 0; j--)
		{
			b[j] = b[j] + a[j];
			if (b[j] >= 10)
			{
				b[j - 1] = b[j - 1] + 1;
				b[j] = b[j] - 10;
		}
	}
    }
	for (i = 0; i < N; i++)
		if (b[i] != 0) break; 
	for (x = i; x < N; x++)
		printf("%d", b[x]);
	return 0;
}


6.大整数乘法

#include<bits/stdc++.h>
using namespace std;
char a1[10001], b1[10001];
int a[10001], b[10001], c[10001];
int main() {
	int lena, lenb, lenc;
	cin >> a1 >> b1;
	lena = strlen(a1);
	lenb = strlen(b1);
	for (int i = 0; i <= lena-1; i++) {
		a[lena - i] = a1[i] - '0';
	}
	for (int i = 0; i <= lenb-1; i++) {
		b[lenb - i] = b1[i] - '0';
	}
	lenc = lena + lenb;
	for (int i = 1; i <= lena; i++) {
		for (int j = 1; j <= lenb; j++) {
			c[i + j - 1] += b[j] * a[i];
			c[i + j] += c[i + j - 1] / 10;
			c[i+j-1]%= 10;

		}
	}
	lenc = lena + lenb;
	while(c[lenc] == 0 && lenc > 0) {
		lenc--;
	}
	for (int i = lenc; i >= 1; i--) {
		cout << c[i];
	}
	return 0;
}

7.大整数除以13,输出商和余数

#include<bits/stdc++.h>
using namespace std;
char a1[10001];
int a[10001],b[101];
const int n = 13;
int x;
int main() {
	cin >> a1;
	int lena = strlen(a1);
	for (int i = 1; i <= lena; i++) {
		a[i] = a1[i - 1]-'0';
	}
	for (int i = 1, x = 0; i <= lena; i++) {
		b[i] = (a[i] + x * 10) / 13;;
		x = (a[i] + x * 10) % 13;
	}
	int len = 1;
	while (b[len] == 0&&len<lena) {
		len++;
	}
	for (int i = len; i <= lena; i++) {
		cout << b[i];
	}
	cout << endl;
	cout << x;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/467058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

复杂网络——半局部中心法

一、概述 由于最近写论文需要使用复杂网络知识中的半局部中心法&#xff0c;但是截止目前来说&#xff0c;网上几乎搜索不到有关的MATLAB程序代码&#xff0c;只有一篇用Python编写的程序&#xff0c;我的电脑中没有python&#xff0c;所以我花费一些时间&#xff0c;利用matla…

Excel数据可视化

饼图 1、选中数据----点击插入----点击饼图 2、更改数据标签&#xff08;修改标题名直接改就行&#xff09; 柱形图 1、选中数据、点击插入二维柱形图 坐标轴问题----切换行和列 如何将横轴变成想要的4、5、6、7月&#xff1f; &#xff08;1&#xff09;右键----选择数据 -…

计算机二级(Python)真题讲解每日一题:《十字叉》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ ‪‬‪‬‪‬‪‬‪‬‮‬‪…

Java解决完全二叉树的节点个数

Java解决完全二叉树的节点个数 01 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的…

202303 CSP认证 | LDAP

LDAP 好好好&#xff0c;难度直线上升&#xff0c;是一道又有了字符串处理味道的第三题 第一把写官网40分&#xff0c;acwing TLE且只通过了一道数据…本文是自己这题奋斗过程 的一个记录 先贴个40分的代码&#xff1a; #include<bits/stdc.h> using namespace std; t…

计算机网络:性能指标

计算机网络&#xff1a;性能指标 速率带宽吞吐量时延时延带宽积往返时间利用率丢包率 本博客介绍计算机网络的性能指标&#xff0c;我们可以从不同的方面来度量计算机网络的性能。常用的计算机网络性能指标有以下 8 个&#xff0c;他们是&#xff1a;速率、带宽、吞吐量、时延、…

Android弹出通知

发现把Android通知渠道的重要性设置为最高时&#xff0c;当发送通知时&#xff0c;通知能直接弹出来显示&#xff0c;以前一直搞不明白为什么别的app的通知可以弹出来&#xff0c;我的不行&#xff0c;搞了半天原来是这个属性在作怪&#xff0c;示例如下&#xff1a; class Ma…

Flink源码解析(1)TM启动

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

CMake学习(上)

1. CMake概述 CMake 是一个项目构建工具&#xff0c;并且是跨平台的。关于项目构建我们所熟知的还有Makefile&#xff08;通过 make 命令进行项目的构建&#xff09;&#xff0c;大多是IDE软件都集成了make&#xff0c;比如&#xff1a;VS 的 nmake、linux 下的 GNU make、Qt …

论文解读之Attention-based Deep Multiple Instance Learning

前言 多实例学习是由监督学习演变而来的&#xff0c;我们都知道&#xff0c;监督学习在训练的时候是一个实例&#xff08;或者说一个样本、一条训练数据&#xff09;对应一个确定的标签。而多实例的特点就是&#xff0c;我们在训练的时候的输入是多个实例对应一个确定的标签&a…

STM32使用常见错误合集(正在更新版)

本文章记录一些学习STM32的一些错误问题 一、编译、烧录类问题 1、烧录不成功&#xff0c;Keil提示RDDI-DAP Error【场景&#xff1a;PWM驱动直流电机】 解决方案&#xff1a;将电机断开再进行烧录&#xff0c;断开后就可以美美烧录不报错啦~ 二、Keil使用问题 1、打开一个…

【设计模式】-工厂模式

工厂模式是一种创建型设计模式&#xff0c;它提供了一种在不指定具体类的情况下创建对象的方法。工厂模式的核心思想是将对象的创建与使用分离&#xff0c;降低系统的耦合度&#xff0c;使系统更加灵活、可扩展。 工厂模式主要分为三种类型&#xff1a;简单工厂模式、工厂方法…

深入解析JVM加载机制

一、背景 Java代码被编译器变成生成Class字节码&#xff0c;但字节码仅是一个特殊的二进制文件&#xff0c;无法直接使用。因此&#xff0c;都需要放到JVM系统中执行&#xff0c;将Class字节码文件放入到JVM的过程&#xff0c;简称类加载。 二、整体流程 三、阶段逻辑分析 3…

断言assert是什么?

assert是什么&#xff1f; assert断言&#xff0c;是一个被定义在<assert.h>头文件中的一个宏&#xff0c;而不是一个函数。 可以用来检查数据的合法性&#xff0c;但是频繁的调用极大影响了程序的性能&#xff0c;增加了额外的开销。可以通过#define NDEBUG来禁用asse…

【Unity】CatlikeCoding SRP

Unity 自定义渲染管线 提示&#xff1a;基于CatlikeCoding SRP系列教程学习 学习链接&#xff1a;SRP 个人测试: Demo 相关记录以后有时间再更&#xff1a;

CLIP解读

1、引言 在计算机视觉领域&#xff0c;通常需要经过训练模型来实现对预定类别目标预测&#xff08;如分类、检测等任务&#xff09;&#xff0c;但是这种形式会限制模型的通用性。比如我们训练完了一个猫狗分类模型&#xff0c;如果现在希望识别一只老虎&#xff0c;那么原来训…

关于mybatis-plus分页查询total=0问题解决

今天复习分布式架构&#xff0c;一步一步从新架构模块&#xff0c;写道mybatis-plus的时候&#xff0c;突然发现分页查询居然total一直等于0。 在项目上的时候&#xff0c;都是架构师吧这个弄好了的&#xff0c;我一直以为直接分页查询&#xff0c;就会有值&#xff0c;原来还…

如何使用 ArcGIS Pro 分析爆炸波及建筑

创建三维图层 在工具箱中点击“3D Analyst 工具\3D要素\转换\依据属性实现要素转3D”,调用依据属性实现要素转3D工具,如下图所示。 调用依据属性实现要素转3D工具 在显示的依据属性实现要素转3D对话框内,输入要素为爆炸点图层,选择高度字段,如下图所示。 依据属性实现…

2024年个人小型渲染农场搭建是否值得?

个人小型渲染农场的搭建是否值得是一个需要综合考虑的问题。对于那些追求高效渲染和成本控制的创作者来说&#xff0c;个人渲染农场提供了自主控制进度的优势。然而&#xff0c;同时也必须面对技术挑战和初期投资的压力。要决定是否投资个人渲染农场&#xff0c;关键在于权衡技…

结构体中的内存对齐是什么?一起搞懂它

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…