当前位置: 首页 > news >正文

高精度计算

主页:(*´∇`*) 咦,又好了~ 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;
}

相关文章:

  • 蓝桥杯物联网竞赛_STM32L071_12_按键中断与串口中断
  • 【Unity】详细介绍
  • Windows10/11添加打印完整图文演示步骤
  • 设置应用软件开机自动启动
  • SpringBoot(拦截器+文件上传)
  • SpringBoot(RESTful,统一响应结构,输出日志,增删改查功能,分页功能,批量删除,常见bug)【详解】
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • Elasticsearch:调整近似 kNN 搜索
  • 微信小程序调用百度智能云API(菜品识别)
  • 【计算机网络】集线器
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Search)
  • 前端开发者如何打造自己的生态以及ip
  • 哥斯拉流量webshell分析-->ASP/PHP
  • Docker 笔记(五)--链接
  • Qt 信号槽
  • Google 是如何开发 Web 框架的
  • create-react-app项目添加less配置
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • export和import的用法总结
  • Git 使用集
  • Js基础——数据类型之Null和Undefined
  • laravel 用artisan创建自己的模板
  • PAT A1017 优先队列
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Protobuf3语言指南
  • Vue实战(四)登录/注册页的实现
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何选择开源的机器学习框架?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我建了一个叫Hello World的项目
  • 用 Swift 编写面向协议的视图
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • raise 与 raise ... from 的区别
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 选择阿里云数据库HBase版十大理由
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 飞书APP集成平台-数字化落地
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (初研) Sentence-embedding fine-tune notebook
  • (七)理解angular中的module和injector,即依赖注入
  • (全注解开发)学习Spring-MVC的第三天
  • (生成器)yield与(迭代器)generator
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)原始图像数据和PDF中的图像数据
  • .net 4.0发布后不能正常显示图片问题
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 中的轻量级线程安全