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语言高精度计算函数库相关推荐

  1. lancet: 一个全面、高效、可复用的go语言工具函数库

    Lancet lancet(柳叶刀)是一个全面.高效.可复用的go语言工具函数库. lancet受到了java apache common包和lodash.js的启发. 特性

  2. C语言数学函数库<math.h>及常用函数

    C语言数学函数库<math.h>及常用函数 一.<math.h> C语言中常用的一个数学函数库,里面涵盖了常用的数学运算,如求对数.指数.绝对值.三角函数.两数中最大数等.使用 ...

  3. c语言cgi函数库,cgic: 为C语言编写CGI的C函数库

    CGIC介绍 怎样写CGIC应用程序 怎样产生图片在CGIC中? CGI调试特征: 利用捕获 cgic函数参考 cgic变量参考 cgic结果编码参考 cgic快速索引 一般的Unix系统都支持ANS ...

  4. C语言Math函数库简介

    C语言的Math库下面有很有实用的库函数,下面简单的介绍下. 1.  abs( )  --添加头文件<stdlib.h> 2.  acos( )  --反余弦函数 --参数范围(-1, 1 ...

  5. c语言cgi函数库,cgic: 为C语言设计CGI地C函数库

    cgic: 为C语言设计CGI地C函数库 cgic: 为C语言编写CGI的C函数库 ---由Thomas Boutell开发 ************************************* ...

  6. c语言图形函数linerel,C语言图形函数库总结graphics.h

    囊括了graphics.h库的主要用法及说明 C语言图形.图像函数库graphics.h.txt C语言图形.图像函数库graphics.h (一) 像素函数 56. putpiel() 画像素点函数 ...

  7. 数值计算方法与c语言工程函数库 pdf,数值计算方法和算法.PDF

    数值计算方法和算法 张韵华 奚梅成 陈效群 编著 2 0 0 2 内 容 简 介 本书介绍各种常用的数值计算方法,简述计算方法的计算对象.计算原 理和计算步骤,给出部分数值方法的算法描述,并附有一些用 ...

  8. 数值计算方法与c语言工程函数库 pdf,数值计算方法与C语言工程函数库

    目 录 第一章 绪论 1.1计算机与计算方法 1.2数值计算的特点及本书的特色 1.3误差.稳定性和收敛性 1.4C语言与数值计算方法 第二章 线性代数方程组的数值解法 2.1引言 2.2高斯-约当消 ...

  9. c语言卡尔曼函数库,kalman之c语言实现

    kalman的文章之前也写过一篇,具体参考:kalman,本文主要是基于c的实现,若有不当之处,望指教,谢谢! typedef struct image_double { double* pix; u ...

最新文章

  1. NYOJ 420 p次方求和 大数的幂
  2. eos操作系统_EOS相机统一的用户界面
  3. win10 设置游戏全屏
  4. python安装matlab库_[python][matlab]在python36上安装matlab2015b引擎
  5. (转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
  6. 1.PHP与Web页面的交互
  7. 4.在屏幕上输出以下图案: * *** ***** ******* ********* *********** ************* *********** *********
  8. Julia: 关于... (三个圆点)
  9. 2017 年“认证杯”数学中国数学建模网络挑战赛 比赛心得
  10. IPFS是创建DWeb应用程序中基础技术的领先者
  11. 怎么把柱形图和折线图放在一起_excel怎么把柱状图和折线图合并
  12. 8大基本数据类型各占多少字节和一些单位常识
  13. 关于高精度交流恒流源设计是怎样的?
  14. HashMap 遍历方式
  15. 如何使用Mixins?mixins混入使用方法
  16. Central Europe Regional Contest 2019 J. Saba1000kg (并查集+根号讨论)
  17. 【shell命令】拆分、合并、排序、比较文件
  18. LeetCode546-20.8.15-移除盒子
  19. 北京面向社会招录消防员900人 将实行全程退出机制
  20. 在Linux系统上配置Samba客户端,访问Samba远程目录

热门文章

  1. jdk的安装(redhat)
  2. php中时间戳和正常日期的相互转化
  3. CString Format
  4. cout输出精确小数点
  5. 谈谈MVC项目中的缓存功能设计的相关问题
  6. 软件项目经理新手上路10 - 要的是计划,还是?
  7. FFmpeg build under MinGW【原创】
  8. 问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(5)——汇总
  9. 问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric)
  10. 第一章 计算机网络概述[知识点+课后习题+练习题]