c语言高精度计算函数库
1#include <stdio.h>
2#include <stdlib.h>
3#define MAX 200
4
5typedef struct
6{
7 int len;
8 int s[MAX+1];
9} hp;
10
11void input(hp *a, int x) //读入数字
12{
13 int i;
14
15 a->len = 0;
16
17 while (x > 0)
18 {
19 a->s[1 + a->len++] = x % 10;
20 x /= 10;
21 }
22
23 for (i = a->len + 1; i <= MAX; i++)
24 a->s[i] = 0;
25}
26
27void input1(hp *a, char *str) //读入字符串
28{
29 int i, len;
30
31 a->len = 0;
32
33 if (str == NULL)
34 return;
35
36 len = strlen(str);
37
38 while (len > 0)
39 {
40 a->s[1 + a->len++] = *(str + len - 1) - '0';
41 len--;
42 }
43
44 for (i = a->len + 1; i <= MAX; i++)
45 a->s[i] = 0;
46}
47
48void print(hp *y) //打印数字
49{
50 int i;
51 for (i = y->len; i >= 1; i--)
52 printf("%d", y->s[i]);
53 printf("\n");
54}
55
56void add(hp *a, hp *b, hp *c) //高精度加法c = a + b
57{
58 int i, len;
59
60 for (i = 1; i <= MAX; i++) c->s[i] = 0;
61
62 if (a->len > b->len) len = a->len;
63 else len = b->len;
64
65 for (i = 1; i <= len; i++)
66 {
67 c->s[i] += a->s[i] + b->s[i];
68 if (c->s[i] >= 10)
69 {
70 c->s[i] -= 10;
71 c->s[i+1]++;
72 }
73 }
74
75 if (c->s[len+1] > 0) len++;
76 c->len = len;
77}
78
79void subtract(hp *a, hp *b, hp *c) //高精度减法c = a - b
80{
81 int i, len;
82
83 for (i = 1; i <= MAX; i++) c->s[i] = 0;
84
85 if (a->len > b->len) len = a->len;
86 else len = b->len;
87
88 for (i = 1; i <= len; i++)
89 {
90 c->s[i] += a->s[i] - b->s[i];
91 if (c->s[i] < 0)
92 {
93 c->s[i] += 10;
94 c->s[i+1]--;
95 }
96 }
97
98 while (len > 1 && c->s[len] == 0) len--;
99 c->len = len;
100}
101
102int compare(hp *a, hp *b) //高精度比较
103{
104 int len;
105
106 if (a->len > b->len) len = a->len;
107 else len = b->len;
108
109 while (len > 0 && a->s[len] == b->s[len]) len--;
110
111 if (len == 0) return 0;
112 else return a->s[len] - b->s[len];
113}
114
115void multiply(hp *a, int b, hp *c) //高精度 * 单精度
116{
117 int i, len;
118
119 for (i = 1; i <= MAX; i++) c->s[i] = 0;
120 len = a->len;
121
122 for (i = 1; i <= len; i++)
123 {
124 c->s[i] += a->s[i] * b;
125 c->s[i+1] += c->s[i] / 10;
126 c->s[i] %= 10;
127 }
128
129 len++;
130 while (c->s[len] >= 10)
131 {
132 c->s[len+1] += c->s[len] / 10;
133 c->s[len] %= 10;
134 len++;
135 }
136
137 while (len > 1 && c->s[len] == 0) len--;
138 c->len = len;
139}
140
141void multiplyh(hp *a, hp *b, hp *c) //高精度 * 高精度
142{
143 int i, j, len;
144
145 for (i = 1; i <= MAX; i++) c->s[i] = 0;
146
147 for (i = 1; i <= a->len; i++)
148 {
149 for (j = 1; j <= b->len; j++)
150 {
151 c->s[i+j-1] += a->s[i] * b->s[j];
152 c->s[i+j] += c->s[i+j-1] / 10;
153 c->s[i+j-1] %= 10;
154 }
155 }
156
157 len = a->len + b->len + 1;
158 while (len > 1 && c->s[len] == 0) len--;
159 c->len = len;
160}
161
162void power(hp *a, int b, hp *c) //高精度乘方c = a ^ b
163{
164 hp e;
165
166 if (b == 0)
167 {
168 c->len = 1;
169 c->s[1] = 1;
170 }
171 else if (b == 1)
172 {
173 memcpy(c, a, sizeof(hp));
174 }
175 else
176 {
177 power(a, b / 2, &e);
178 multiplyh(&e, &e, c);
179
180 if (b % 2 == 1)
181 {
182 memcpy(&e, c, sizeof(hp));
183 multiplyh(&e, a, c);
184 }
185 }
186}
187
188void divide(hp *a, int b, hp *c, int *d) //高精度 / 单精度 {d为余数}
189{
190 int i, len;
191
192 for (i = 1; i <= MAX; i++) c->s[i] = 0;
193 len = a->len;
194 *d = 0;
195
196 for (i = len; i >= 1; i--)
197 {
198 *d = *d * 10 + a->s[i];
199 c->s[i] = *d / b;
200 *d %= b;
201 }
202
203 while (len > 1 && c->s[len] == 0) len--;
204 c->len = len;
205}
206
207void multiply10(hp *a) //高精度 * 10
208{
209 int i;
210 for (i = a->len; i >= 1; i--)
211 a->s[i+1] = a->s[i];
212
213 a->s[1] = 0;
214 a->len++;
215 while (a->len > 1 && a->s[a->len] == 0) a->len--;
216}
217
218void divideh(hp *a, hp *b, hp *c, hp *d) //高精度 / 高精度{d为余数}
219{
220 hp e;
221 int i, len;
222
223 for (i = 1; i <= MAX; i++)
224 {
225 c->s[i] = 0;
226 d->s[i] = 0;
227 }
228
229 len = a->len;
230 d->len = 1;
231
232 for (i = len; i >= 1; i--)
233 {
234 multiply10(d);
235 d->s[1] = a->s[i];
236
237 while (compare(d, b) >= 0)
238 {
239 subtract(d, b, &e);
240 *d = e;
241 c->s[i]++;
242 }
243 }
244
245 while (len > 1 && c->s[len] == 0) len--;
246 c->len = len;
247}
转载于:https://www.cnblogs.com/HappyXie/articles/1927557.html
c语言高精度计算函数库相关推荐
- lancet: 一个全面、高效、可复用的go语言工具函数库
Lancet lancet(柳叶刀)是一个全面.高效.可复用的go语言工具函数库. lancet受到了java apache common包和lodash.js的启发. 特性
- C语言数学函数库<math.h>及常用函数
C语言数学函数库<math.h>及常用函数 一.<math.h> C语言中常用的一个数学函数库,里面涵盖了常用的数学运算,如求对数.指数.绝对值.三角函数.两数中最大数等.使用 ...
- c语言cgi函数库,cgic: 为C语言编写CGI的C函数库
CGIC介绍 怎样写CGIC应用程序 怎样产生图片在CGIC中? CGI调试特征: 利用捕获 cgic函数参考 cgic变量参考 cgic结果编码参考 cgic快速索引 一般的Unix系统都支持ANS ...
- C语言Math函数库简介
C语言的Math库下面有很有实用的库函数,下面简单的介绍下. 1. abs( ) --添加头文件<stdlib.h> 2. acos( ) --反余弦函数 --参数范围(-1, 1 ...
- c语言cgi函数库,cgic: 为C语言设计CGI地C函数库
cgic: 为C语言设计CGI地C函数库 cgic: 为C语言编写CGI的C函数库 ---由Thomas Boutell开发 ************************************* ...
- c语言图形函数linerel,C语言图形函数库总结graphics.h
囊括了graphics.h库的主要用法及说明 C语言图形.图像函数库graphics.h.txt C语言图形.图像函数库graphics.h (一) 像素函数 56. putpiel() 画像素点函数 ...
- 数值计算方法与c语言工程函数库 pdf,数值计算方法和算法.PDF
数值计算方法和算法 张韵华 奚梅成 陈效群 编著 2 0 0 2 内 容 简 介 本书介绍各种常用的数值计算方法,简述计算方法的计算对象.计算原 理和计算步骤,给出部分数值方法的算法描述,并附有一些用 ...
- 数值计算方法与c语言工程函数库 pdf,数值计算方法与C语言工程函数库
目 录 第一章 绪论 1.1计算机与计算方法 1.2数值计算的特点及本书的特色 1.3误差.稳定性和收敛性 1.4C语言与数值计算方法 第二章 线性代数方程组的数值解法 2.1引言 2.2高斯-约当消 ...
- c语言卡尔曼函数库,kalman之c语言实现
kalman的文章之前也写过一篇,具体参考:kalman,本文主要是基于c的实现,若有不当之处,望指教,谢谢! typedef struct image_double { double* pix; u ...
最新文章
- NYOJ 420 p次方求和 大数的幂
- eos操作系统_EOS相机统一的用户界面
- win10 设置游戏全屏
- python安装matlab库_[python][matlab]在python36上安装matlab2015b引擎
- (转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
- 1.PHP与Web页面的交互
- 4.在屏幕上输出以下图案: * *** ***** ******* ********* *********** ************* *********** *********
- Julia: 关于... (三个圆点)
- 2017 年“认证杯”数学中国数学建模网络挑战赛 比赛心得
- IPFS是创建DWeb应用程序中基础技术的领先者
- 怎么把柱形图和折线图放在一起_excel怎么把柱状图和折线图合并
- 8大基本数据类型各占多少字节和一些单位常识
- 关于高精度交流恒流源设计是怎样的?
- HashMap 遍历方式
- 如何使用Mixins?mixins混入使用方法
- Central Europe Regional Contest 2019 J. Saba1000kg (并查集+根号讨论)
- 【shell命令】拆分、合并、排序、比较文件
- LeetCode546-20.8.15-移除盒子
- 北京面向社会招录消防员900人 将实行全程退出机制
- 在Linux系统上配置Samba客户端,访问Samba远程目录