数组实现长整数四则运算c语言,[转载]长整数四则运算  程序(1)

#include

#include

#include

typedef struct LinkNode

{

int

data; //记录每个节点的整数(小于10000)

LinkNode *next,

*pre; //记录下一个节点的地址

*pre; //记录前一个节点的地址

}linklist;

linklist *head0;

linklist

*head1; //head0,head1分别记录两个整数链表的头指针

linklist *currptr;

linklist

*result; //result记录结果链表的头指针

//LinkList(); //构造函数,初始化链表

//LinkList1(); //析构函数,释放空间

//void Creat(char

a[]); //引入字符串,创立两个链表,分别表示两个整数

//void

Add(); //实现两个整数相加

//void

Display(); //显示结果

void

addtwo();

int sum(int n);

void

LinkList() //构造函数,初始化链表

{

//linklist *head0,*head1;

//linklist *currptr;

head0=(linklist

*)malloc(sizeof(linklist)); //申请一个空间记录整数的符号和节点数

head1=(linklist

*)malloc(sizeof(linklist));

result=(linklist

*)malloc(sizeof(linklist));

head0->next=head0;

head0->pre=head0; //初始化链表,建立双向循环链表

head1->next=head1;

head1->pre=head1;

result->next=result;

result->pre=result;

currptr=NULL;

}

void

LinkList1() //析构函数,释放空间

{

linklist

*p1=head0,*p2=head1,*p3=result;

//三个指针分别指向三条链表的头指针

while(p1!=p1->pre)

{

p1->pre->next=p1->next;

p1->next->pre=p1->pre;

currptr=p1;

p1=p1->next;

free(currptr);

}

while(p2!=p2->pre) //逐个删除节点,释放空间

{

p2->pre->next=p2->next;

p2->next->pre=p2->pre;

currptr=p2;

p2=p2->next;

free(currptr);

}

while(p3!=p3->pre)

{

p3->pre->next=p3->next;

p3->next->pre=p3->pre;

currptr=p3;

p3=p3->next;

free(currptr);

}

// delete p1;

// delete p2;

// delete p3;

}

void Creat(char

a[]) //引入字符串,创立两个链表,分别表示两个整数

{

int

i=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0;

//i记录字符串,j记录加数节点数;s记录被加数节点数

C语言中,整数可以用`long long`或`int64_t`来表示。下面是整数四则运算的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define MAX_LEN 1000 // 最大位数 typedef struct { int64_t num[MAX_LEN]; // 数字数组 int len; // 数字度 } BigInt; // 初始化一个大整数 void init(BigInt *n) { for (int i = 0; i < MAX_LEN; i++) { n->num[i] = 0; } n->len = 0; } // 把字符串转成大整数 void str_to_bigint(char *str, BigInt *n) { init(n); int len = strlen(str); for (int i = 0; i < len; i++) { n->num[i] = str[len-1-i] - '0'; } n->len = len; } // 输出大整数 void print_bigint(BigInt *n) { for (int i = n->len-1; i >= 0; i--) { printf("%lld", n->num[i]); } printf("\n"); } // 加法 void add(BigInt *a, BigInt *b, BigInt *c) { init(c); int carry = 0; for (int i = 0; i < MAX_LEN; i++) { int64_t sum = a->num[i] + b->num[i] + carry; c->num[i] = sum % 10; carry = sum / 10; if (sum != 0) { c->len = i + 1; } } } // 减法 int cmp(BigInt *a, BigInt *b) { if (a->len != b->len) { return a->len - b->len; } for (int i = a->len-1; i >= 0; i--) { if (a->num[i] != b->num[i]) { return a->num[i] - b->num[i]; } } return 0; } void sub(BigInt *a, BigInt *b, BigInt *c) { init(c); int borrow = 0; for (int i = 0; i < MAX_LEN; i++) { int64_t diff = a->num[i] - b->num[i] - borrow; if (diff < 0) { diff += 10; borrow = 1; } else { borrow = 0; } c->num[i] = diff; if (diff != 0) { c->len = i + 1; } } } // 乘法 void mul(BigInt *a, BigInt *b, BigInt *c) { init(c); for (int i = 0; i < a->len; i++) { int64_t carry = 0; for (int j = 0; j < b->len; j++) { int64_t tmp = a->num[i] * b->num[j] + carry + c->num[i+j]; c->num[i+j] = tmp % 10; carry = tmp / 10; if (tmp != 0 && i+j+1 > c->len) { c->len = i+j+1; } } if (carry != 0) { c->num[i+b->len] = carry; c->len = i+b->len+1; } } } // 除法 void divide(BigInt *a, BigInt *b, BigInt *c, BigInt *r) { init(c); init(r); for (int i = a->len-1; i >= 0; i--) { shift_left(r); r->num[0] = a->num[i]; r->len++; while (cmp(r, b) >= 0) { sub(r, b, r); add(&one, c, c); } } } int main() { BigInt a, b, c, r; char str[MAX_LEN]; scanf("%s", str); str_to_bigint(str, &a); scanf("%s", str); str_to_bigint(str, &b); add(&a, &b, &c); printf("a + b = "); print_bigint(&c); sub(&a, &b, &c); printf("a - b = "); print_bigint(&c); mul(&a, &b, &c); printf("a * b = "); print_bigint(&c); divide(&a, &b, &c, &r); printf("a / b = "); print_bigint(&c); printf("a %% b = "); print_bigint(&r); return 0; } ``` 在上面的代码中,使用了一个结构体`BigInt`来存储大整数,使用字符串转换函数`str_to_bigint`来把输入的字符串转成大整数。四则运算的实现分别是`add`、`sub`、`mul`和`divide`函数,其中除法使用了一个辅助函数`cmp`来比较两个大整数的大小,使用了一个辅助函数`shift_left`来进行位移操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值