当前位置: 首页 > 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 信号槽
  • conda常用的命令
  • emacs初体验
  • Java面向对象及其三大特征
  • jdbc就是这么简单
  • laravel5.5 视图共享数据
  • MYSQL 的 IF 函数
  • PHP变量
  • Python - 闭包Closure
  • QQ浏览器x5内核的兼容性问题
  • sublime配置文件
  • underscore源码剖析之整体架构
  • 将 Measurements 和 Units 应用到物理学
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 王永庆:技术创新改变教育未来
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一、python与pycharm的安装
  • gunicorn工作原理
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • !$boo在php中什么意思,php前戏
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (poj1.2.1)1970(筛选法模拟)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 使用配置文件
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [BT]BUUCTF刷题第4天(3.22)
  • [C#]C#学习笔记-CIL和动态程序集
  • [CQOI 2011]动态逆序对
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析