用递归写的大数运算
来源:互联网 发布:java爬虫抓取天眼查 编辑:程序博客网 时间:2024/05/18 19:23
- 用递归写的大数运算
- #include <stdio.h>
- typedef struct BigNum_
- {
- int data[256];
- int n;
- } BigNum;
- BigNum* carry(BigNum* bn, int curr, int valid, int inc)
- {
- return curr>=valid && inc ? (++bn->n,
- bn->data[curr] = inc%10000, carry(bn, curr+1, valid, inc/10000)) : bn;
- }
- BigNum* mul(BigNum* bn, int n, int curr, int valid, int inc)
- {
- int t = inc+bn->data[curr]*n;
- return curr >= valid ?
- carry(bn, curr, valid, inc) :
- (bn->data[curr]=t%10000, mul(bn, n, curr+1, valid, t/10000));
- }
- BigNum* power(BigNum* bn, int n, int p)
- {
- return --p ? (power(bn, n, p), mul(bn, n, 0, bn->n, 0)) :
- (bn->n=1, bn->data[0] = n, bn);
- }
- BigNum* fac(BigNum* bn, int n)
- {
- return n ? (fac(bn, n-1), mul(bn, n, 0, bn->n, 0)): (bn->n=1, bn->data[0] = 1, bn);
- }
- void show(BigNum* bn, int curr)
- {
- if (curr != bn->n)
- {
- show(bn, curr+1);
- curr == bn->n -1 ? printf("%d", bn->data[curr]) :
- printf("%04d", bn->data[curr]);
- !curr ? puts("") : 0;
- }
- }
- int main(int argc, char* argv[])
- {
- BigNum n;
- show(power(&n, 13, 13), 0);
- show(fac(&n, 13), 0);
- return 0;
- }