随笔 - 6  文章 - 3  trackbacks - 0
<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

  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 == 0return 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    *= 0;
195     
196    for (i = len; i >= 1; i--)
197    {
198        *= ** 10 + a->s[i];
199        c->s[i] = */ b;
200        *%= 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            *= e;
241            c->s[i]++;
242        }

243    }

244     
245    while (len > 1 && c->s[len] == 0) len--;
246    c->len = len;
247}
posted on 2011-01-06 00:15 姚冰 阅读(3865) 评论(1)  编辑 收藏 引用

FeedBack:
# re: C语言高精度运算函数库 2012-06-26 10:08 snowonion
怎么复制代码啊……直接全选会把行号带上的。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理