C语言单链表实现大数加法和乘法
- 格式:docx
- 大小:425.42 KB
- 文档页数:13
#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef int ElemType;/*单项链表的声明*/typedef struct PolynNode{int coef; // 系数int expn; // 指数struct PolynNode *next;}PolynNode,*PolynList;/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/ /*指数系数一对一对输入*/void CreatePolyn(PolynList &L,int n){int i;PolynList p,q;L=(PolynList)malloc(sizeof(PolynNode)); // 生成头结点L->next=NULL;q=L;printf("成对输入%d个数据\n",n);for(i=1;i<=n;i++){p=(PolynList)malloc(sizeof(PolynNode));scanf("%d%d",&p->coef,&p->expn); //指数和系数成对输入q->next=p;q=q->next;}p->next=NULL;}// 初始条件:单链表L已存在// 操作结果: 依次对L的每个数据元素调用函数vi()。
一旦vi()失败,则操作失败void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)){PolynList p=L->next;while(p){vi(p->coef, p->expn);if(p->next){printf(" + "); //“+”号的输出,最后一项后面没有“+” }p=p->next;}printf("\n");}/*ListTraverse()调用的函数(类型要一致)*/void visit(ElemType c, ElemType e){if(c != 0){printf("%dX^%d",c,e); //格式化输出多项式每一项}}/* 多项式相加,原理:归并 *//* 参数:两个已经存在的多项式 *//* 返回值:归并后新的多项式的头结点 */PolynList MergeList(PolynList La, PolynList Lb){PolynList pa, pb, pc, Lc;pa = La->next;pb = Lb->next;Lc = pc = La; // 用La的头结点作为Lc的头结点while(pa&&pb){if(pa->expn < pb->expn){pc->next = pa; //如果指数不相等,pc指针连上指数小的结点,pc = pa;pa = pa->next; //指向该结点的指针后移}else if(pa ->expn > pb->expn ){pc->next = pb; //pc指针连上指数小的结点,pc = pb;pb = pb->next; //指向该结点的指针后移}else//(pa ->expn = pb->expn ){pa->coef = pa->coef + pb->coef; //指数相等时,系数相加 pc->next = pa;pc = pa;pa = pa->next; //两指针都往后移pb = pb->next;}}pc->next = pa ? pa:pb; // 插入剩余段return Lc;}void main(){PolynList ha,hb,hc;printf("非递减输入多项式ha, ");CreatePolyn(ha,5); // 正位序输入n个元素的值printf("非递减输入多项式hb, ");CreatePolyn(hb,5); // 正位序输入n个元素的值printf("多项式ha :");PolynTraverse(ha, visit); printf("\n");printf("多项式hb :"); PolynTraverse(hb, visit); printf("\n");hc = MergeList(ha,hb); PolynTraverse(hc, visit); }。
C语⾔单链表实现多项式相加本⽂实例为⼤家分享了C语⾔单链表实现多项式相加的具体代码,供⼤家参考,具体内容如下//多项式的相加和相乘#include<stdio.h>#include<stdlib.h>#pragma warning(disable:4996)//兼容scanftypedef struct node {int coef;int expon;struct node* link;}Polynode,*Polynomial;Polynomial InsertPolyLinklist(Polynomial in,Polynomial Pread) {Pread->link = in;Pread = in;in->link = NULL;return Pread;}Polynomial ReadPoly(void) {Polynomial Pread = (Polynomial)malloc(sizeof(Polynode));Pread->link = NULL;Polynomial H = Pread;int N;scanf("%d ", &N);while (N--) {Polynomial p = (Polynomial)malloc(sizeof(Polynode));scanf("%d %d", &p->coef, &p->expon);Pread= InsertPolyLinklist(p,Pread);}Polynomial F;F = H->link;free(H);return F;}void PrintPoly(Polynomial F) {while(F != NULL) {printf("%d %d ", F->coef, F->expon);F = F->link;}printf("\n");}Polynomial Add(Polynomial p1, Polynomial p2) {Polynomial t1=p1,t2=p2;Polynomial p=(Polynomial)malloc(sizeof(Polynode));p->link = NULL;Polynomial q = p;Polynomial read;while (t1&&t2) {if (t1->expon == t2->expon) {if (t1->coef + t2->coef) {t1->coef = t1->coef + t2->coef;t1->expon = t1->expon;read = t1;q->link = read;q = read;t1 = t1->link;t2 = t2->link;}}else {if (t1->expon > t2->expon){read = t1;q->link = read;q = read;t1 = t1->link;}else {if (t1->expon < t2->expon) {read = t2;q->link = read;q = read;t2 = t2->link;}}}}if (t1) {q->link = t1;}if (t2) {q->link = t2;}Polynomial F = p->link;free(p);return F;}int main(void) {Polynomial p1, p2, pp, ps;p1 = ReadPoly();PrintPoly(p1);p2 = ReadPoly();PrintPoly(p2);pp = Add(p1, p2);PrintPoly(pp);// ps = Mult(p1, p2);// PrintPoly(ps);return 0;}参考MOOC 浙⼤数据结构以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
单链表⼤整数加法单链表⼤整数加法,节点是char型。
First List: head->1->8->9Second List: head->9->8->1Result List: head->1->1->7->0实现了单链表(),现在使⽤单链表实现⼤整数加法1 #include "stdafx.h"2 #include "SingleList.h"3 #include <string.h>4class BigDataList{5public:6 BigDataList(){7 }8public:9 SingleList<char>* add(SingleList<char> &l1, SingleList<char> &l2);10 };11 SingleList<char>* BigDataList::add(SingleList<char> &l1 , SingleList<char> &l2){12 l1.ReverseSinglyLinkedList();13 l2.ReverseSinglyLinkedList();14 SingleList<char> *l3=new SingleList<char>;15int length1 = l1.length();16int length2 = l2.length();17int ceil = 0 ;18int mod = 0;19int i = 0;20if(length2==length1){21for(;i <length1 && i < length2 ; i++){22 mod = ((l1.get(i)-'0')+((l2.get(i)-'0'))+ceil)%10;23 ceil = ((l1.get(i)-'0')+((l2.get(i)-'0'))+ceil)/10;24 l3->insert('0'+mod,i);25 }26if(ceil>0){27 l3->insert(ceil+'0',i);28 }29 }30else if(length1>length2){31for(; i<length2 ; i++){32 mod = ((l1.get(i)-'0')+((l2.get(i)-'0'))+ceil)%10;33 ceil = ((l1.get(i)-'0')+((l2.get(i)-'0'))+ceil)/10;34 l3->insert('0'+mod,i);35 }36for(;i<length1;i++){37 mod = ((l1.get(i)-'0')+ceil)%10;38 ceil = ((l1.get(i)-'0')+ceil)/10;39 l3->insert('0'+mod,i);40 }41if(ceil>0){42 l3->insert(ceil+'0',i);43 }44 }45else{46for(; i<length1 ; i++){47 mod = ((l1.get(i)-'0')+((l2.get(i)-'0'))+ceil)%10;48 ceil = ((l1.get(i)-'0')+((l2.get(i)-'0'))+ceil)/10;49 l3->insert('0'+mod,i);50 }51for(;i<length2;i++){52 mod = ((l2.get(i)-'0')+ceil)%10;53 ceil = ((l2.get(i)-'0')+ceil)/10;54 l3->insert('0'+mod,i);55 }56if(ceil>0){57 l3->insert(ceil+'0',i);58 }59 }60 l3->ReverseSinglyLinkedList();61 l3->print();6263return l3;64 }。
链表实现⼤整数相加#include <bits/stdc++.h>using namespace std;typedef struct node{int value;node *next;}linklist;linklist* ReverseList(linklist *head){linklist *next;linklist *pre = NULL;while (head != NULL) {next = head->next;head->next = pre;pre = head;head = next;}return pre;}linklist* ADD(linklist*L1, linklist*L2){linklist *l1 = ReverseList(L1);linklist *l2 = ReverseList(L2);linklist *res = NULL, *p;int num = 0, sum;while(l1 || l2){if(l1 && l2){sum = l1->value + l2->value + num;l1 = l1->next;l2 = l2->next;} else if(l1){sum = l1->value + num;l1 = l1->next;} else if(l2){sum = l2->value + num;l2 = l2->next;}num = sum/10;sum = sum%10;linklist *tmp = new linklist();tmp->value = sum;if(res == NULL){res = tmp;p = res;}else {p->next = tmp;p = p->next;}}res = ReverseList(res);return res;}linklist* CreateList(int Size){int num;linklist *head = NULL, *p;while(Size--){cin >> num;linklist *tmp = new linklist();tmp->value = num;if(head == NULL){head = tmp;p = head;}else {p->next = tmp;p = p->next;}}return head;}void PRINT(linklist *head){linklist *p = head;if(p != NULL){cout << p->value;p = p->next;}while(p != NULL){cout << "->" << p->value ;p=p->next;}cout << endl;}int main(){int n, m;cin >> n >> m;linklist *L1 = CreateList(n);//PRINT(L1);linklist *L2 = CreateList(m);//PRINT(L2);linklist *L3 = ADD(L1, L2);PRINT(L3);return0;}/*输⼊:5 33 14 6 72 3 3输出结果:3->1->7->0->0时间复杂度为O(max(n,m)),空间复杂度为O(max(n,m));若可以修改原链表结构,可将空间复杂度降为O(1);*/。
数据结构C语⾔描述——⽤单链表实现多项式的相加#include <stdio.h>#include <stdlib.h>typedef DataType;typedef struct Node2{DataType xishu;DataType zhisu;struct Node2 *Next;}Node2;typedef struct Node2* PNode2;//多项式按照指数⼤⼩排序void insertNewPoint_link(PNode2 head,PNode2 qNode){PNode2 p=head;while (p->Next!=NULL){if (p->Next->zhisu>qNode->zhisu){qNode->Next=p->Next;p->Next=qNode;break;}p=p->Next;}if (p->Next==NULL){p->Next=qNode;}}//打印多项式void printLinkeLink(PNode2 head){PNode2 temp=head->Next;while (temp!=NULL){printf("%d %d",temp->xishu,temp->zhisu);printf("\n");temp=temp->Next;}}//多项式的加法计算void add_poly(Node2 *pa,Node2 *pb){Node2 *p=pa->Next;Node2 *q=pb->Next;Node2 *pre=pa;Node2 *u;while (p!=NULL&&q!=NULL){if (p->zhisu<q->zhisu){pre=p;p=p->Next;}else if(p->zhisu==q->zhisu){float x=p->xishu+q->xishu;if (x!=0){p->xishu=x;pre=p;}else{pre->Next=p->Next;//指向下⼀个结点free(p);}p=pre->Next;u=q;q=q->Next;free(u);}else{u=q->Next;q->Next=p;pre->Next=q;pre=q;q=u;}}if (q){pre->Next=q;}free(pb);}void main( ){int zhishu;float xishu;PNode2 head1=(PNode2)malloc(sizeof(struct Node2));PNode2 head2=(PNode2)malloc(sizeof(struct Node2));PNode2 tem=NULL;head1->Next=NULL;head2->Next=NULL;printf("输⼊链表⼀的系数和指数,如:3,2 以0,0结束输⼊:\n"); scanf("%f,%d",&xishu,&zhishu);while (xishu!=0||zhishu!=0){tem=(PNode2)malloc(sizeof(struct Node2));tem->xishu=xishu;tem->zhisu=zhishu;tem->Next=NULL;insertNewPoint_link(head1,tem);scanf("%f,%d",&xishu,&zhishu);}printf("链表⼀按指数升序排序后的多项式为:\n");printLinkeLink(head1);printf("\n");printf("输⼊链表⼀的系数和指数,如:3,2 以0,0结束输⼊:\n"); scanf("%f,%d",&xishu,&zhishu);while (xishu!=0||zhishu!=0){tem=(PNode2)malloc(sizeof(struct Node2));tem->xishu=xishu;tem->zhisu=zhishu;tem->Next=NULL;insertNewPoint_link(head2,tem);scanf("%f,%d",&xishu,&zhishu);}printf("链表⼆按指数升序排序后的多项式为:\n");printLinkeLink(head2);printf("\n");add_poly(head1,head2);printf("多项式相加后的结果为:\n");printLinkeLink(head1);}。
大整数加减运算的C语言实现一、大整数的表示:二、大整数的加法:大整数的加法运算过程与平常的加法运算类似,从个位开始逐位相加,并考虑进位的情况。
实现大整数的加法过程如下:1.首先创建一个新的数组,用于存储结果。
2.定义两个指针,分别指向两个加数数组的最低位。
3.从最低位开始,将对应位置的数值相加,并判断是否有进位。
4.如果有进位,则将进位值加到下一位。
5.重复第3、4步,直到两个加数数组遍历完。
6.最后判断是否还有进位,如果有,则需要将进位添加到结果数组的高位。
以下是大整数加法的C语言实现代码:```c#include <stdio.h>#include <string.h>//定义大整数结构体typedef structint digits[1000];int length;} BigInt;//大整数的加法BigInt addBigInt(BigInt a, BigInt b)BigInt result;memset(result.digits, 0, sizeof(result.digits)); int carry = 0; // 进位int i;for (i = 0; i < a.length , i < b.length; i++) int sum = a.digits[i] + b.digits[i] + carry; result.digits[i] = sum % 10;carry = sum / 10;}if (carry != 0)result.digits[i] = carry;result.length = i + 1;} elseresult.length = i;}return result;int mai//创建两个大整数BigInt a, b;memset(a.digits, 0, sizeof(a.digits));memset(b.digits, 0, sizeof(b.digits));//可以通过字符串形式初始化大整数a.length = strlen(a.digits);b.length = strlen(b.digits);//进行大整数的加法运算BigInt sum = addBigInt(a, b);//打印结果for (int i = sum.length - 1; i >= 0; i--) printf("%d", sum.digits[i]);}return 0;```三、大整数的减法:大整数的减法运算过程与平常的减法运算类似,从个位开始逐位相减,并考虑借位的情况。
C++单链表实现⼤数加法本⽂实例为⼤家分享了C++单链表实现⼤数加法,供⼤家参考,具体内容如下Input Format输⼊⽂件包括两⾏。
第⼀⾏包括⼀个正整数,保证位数不超过1000000。
第⼆⾏包括⼀个正整数,保证位数不超过1000000。
Output Format输出⽂件包括⼀⾏。
第⼀⾏包括⼀个正整数。
Sample Input1055822Sample Output10580#include <iostream>using namespace std;class BigData {friend ostream &operator<<(ostream &os, const BigData &x);friend istream &operator>>(istream &is, BigData &x);friend BigData operator+(BigData a, BigData b);private:struct node {int data;node *next;node(const short &x, node *n = NULL) {data = x;next = n;}};node *num;void clear();public:BigData(node *p = NULL) {if (p == NULL) {num = new node(0);} else {num = p;};}BigData(const BigData &);~BigData() {clear();}BigData &operator=(const BigData &);};BigData::BigData(const BigData &x) {num = new node(x.num->data);node *p = num, *q = x.num;while (q->next != NULL) {q = q->next;p->next = new node(q->data);p = p->next;}}void BigData::clear() {node *p = num, *q;while (p != NULL) {q = p;p = p->next;delete q;}num = NULL;}BigData operator+(BigData a, BigData b) {BigData tmp;BigData::node *p, *q, *end;int carry;tmp.num = end = new BigData::node(a.num->data + b.num->data); carry = tmp.num->data / 10;tmp.num->data %= 10;p = a.num->next;q = b.num->next;end = tmp.num;while (p != NULL && q != NULL) {end->next = new BigData::node(p->data + q->data + carry);end = end->next;carry = end->data / 10;end->data %= 10;p = p->next;q = q->next;}if (p == NULL)p = q;while (p != NULL) {end->next = new BigData::node(p->data + carry);end = end->next;carry = end->data / 10;end->data %= 10;p = p->next;}if (carry != 0) {end->next = new BigData::node(carry);return tmp;}}BigData &BigData::operator=(const BigData &x) {if (&x == this)return *this;clear();num = new node(x.num->data);node *p = num, *q = x.num;while (q->next != NULL) {q = q->next;p->next = new node(q->data);p = p->next;}return *this;}istream &operator>>(istream &is, BigData &x) {char ch;x.clear();while ((ch = is.get()) != '\n') {x.num = new BigData::node(ch - '0', x.num);}return is;}ostream &operator<<(ostream &os, const BigData &x) {string s;BigData::node *p = x.num;while (p != NULL) {s = char(p->data + '0') + s;p = p->next;}for (int i = 0; i < s.size(); ++i)os << s[i];return os;}int main() {BigData a, b, c;cin >> a >> b;c = a + b;cout << c;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
c语⾔⼤数加法、阶乘和乘法⼀.⼤数加法定义两个⾜够⼤的数字,其数值远超过long的取值范围,设该⼤数的位数有两百位,求其相加所得⼤数加法的核⼼思想详见此链接,内有详细的动画演⽰,这⾥不再赘述直接上代码:#include<string.h>#include<stdio.h>#define N 10//定义当前⼀个⾜够⼤的数字为10位,可任意更改void print_num(int a[],int n){int i=n-1;//从逆序数组的最后⼀项开始查找,进⾏反逆序while(a[i]==0)//由于规定的数组⽐真实计算的数字⼤,所以数组最后⼏位必定存在0的情况--i;//这种情况下⼀定要将0舍去,否则会抬⾼数组的位数for(;i>=0;i--)//找到⾮零的数组,进⾏反逆序输出printf("%d",a[i]);}void plus(int num1[],int num2[],int n){//尤其注意!由于数组是逆序的,所以num[0]是个位,num[1]是⼗位,num[2]是百位for(int i=0,up=0;i<n;i++)//算法参考⼩学加法,这⾥定义⼀个up进位标记{int temp=num1[i]+num2[i]+up;//up最开始设为0,因为在个位⽆法获取进位num1[i]=temp%10;//若产⽣进位⾏为,则选取个位部分赋给num1up=temp/10;//在个位上,若个位相加产⽣进位,则⽤temp/10取整加到下⼀次的⼗位上}print_num(num1, n);}int main(){char buffer1[]="123456";//缓冲数组,将当前数组倒序写⼊num1中char buffer2[]="78951234";//同上,写⼊num2中int num1[N]={0};//将num1,2全部置为0,⽤来将缓冲数组写⼊到num数组当中int num2[N]={0};int n=N;//定义上述两个数组的长度为10for(int i=0,temp=(int)strlen(buffer1)-1;temp>=0;temp--)num1[i++]=buffer1[temp]-'0';//⽤倒序的⽅式将缓冲数组写⼊num中,意味着num的第⼀位是个位,第⼆位是⼗位,三是百位...for(int i=0,temp=(int)strlen(buffer2)-1;temp>=0;temp--)num2[i++]=buffer2[temp]-'0';plus(num1, num2, n);//将两数字相加printf("\n");}⼆.⼤数阶乘⼤数阶乘的中⼼思想参考上述视频和⼀篇博客,博客详情:但是,这⾥需要说明⼀个点:1*2=2,将2存到a[0]中,接下来是⽤a[0]*3;2*3=6,将6储存在a[0]中,接下来是⽤a[0]*4;6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,接下来是⽤a[0]*5;a[1]*5+num(如果前⼀位相乘结果位数是两位数,那么num就等于⼗位上的那个数字;如果是⼀位数,num==0)24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中由于上述博客存在某些地⽅没有说清楚的情况,这⾥解释⼀下关于上述博客的Q&A:1.这⾥的num指的是什么?答:这⾥的num指的是前⾯两数值相乘后进位数位多少:例如6*4得24,这⾥的num值的是24/10=2,进位数为2,num=22.下⾯代码为什么要充i=2开始?答:如果这⾥看懂了代码其实理解2不是很难,但是没有看懂是真的难懂:⾸先明确⼀点:5的阶乘是1*2*3*4*5,我定义的value数组的第⼀位为1,⽽我的i是从2起的,这样以来不就直接凑出了1*2了吗?当我的i⾃增到3,我直接在value数组中找出1*2的值,拿他们去和3相乘,也就凑成了1*2*3了3.如何在代码当中表现出进位的思想?答:我们以5!为例,当计算到1*2*3*4的时候,value当中的表现形式是42000000,从左到右依次是个位,⼗位,百位,千位...etc(value表⽰的是24这个数字)我们在关于j的循环当中拿i=5去和value数组求乘积:5先和位于个位的4求积得20:20%10得0,0放⼊个位中;20/10得2,进位为2,up=2。
上机实习三一,实验题目:单链表多项式加法算法实现二,实验目的:结合实际问题掌握线性表链式存储结构的C语言描述及运算算法的实现。
设计一个一元多项式加法器,界面为菜单形式。
程序功能:1、(菜单)主程序2、输入并建立多项式3、多项式a和b相加,建立多项式a+b。
4、输出多项式,输出形式为整数序列n,c1,e1,c2,e2,…,cn,en。
n是多项式的项数,ci、ei分别是第i项的系数和指数。
三,功能层次图主函数调用创建函数创建A和B多项式调用加多项式函数加A和B调用输出函数程序结束四,运行结果创建A表创建B表加两个A,B的多项赋给C式A,B,C的结果五,小结在做这个程序的时候,虽然遇到一些问题,但最后都被我解决,自信心上得到比较大的提升,这也是这次实践最大的收获。
同时,知识上的收获也是不可忽视的,亲手解决问题的过程也是很好的学习过程,并且积累了一些经验,相信会为以后的学习发展带来非常积极的帮助。
源代码:#include<stdio.h>#include<conio.h>#include<alloc.h>#include<stdlib.h>typedef struct pnode{float coef; /* xishu */int exp; /* zhishu */struct pnode *next;}polynode;polynode *createList(){float xishu;int zhishu;polynode *head,*r;r=malloc(sizeof(polynode));r->coef=0;r->exp=-1;r->next=r;head=r;printf("<<Input XiShu 111 to stop>>\n");printf("Input XiShu:");scanf("%f",&xishu);printf("Input ZhiShu:");scanf("%d",&zhishu);while(1){r->next=malloc(sizeof(polynode));r=r->next;r->coef=xishu;r->exp=zhishu;printf("Input XiShu:");scanf("%f",&xishu);if(xishu==111) break;printf("Input ZhiShu:");scanf("%d",&zhishu);}r->next=head;return head;}void display(polynode *head){int i=1;polynode *t;if(head==NULL){printf("List is empty\n");return;}t=head->next;printf("[%0.0f][%d]\t",head->coef,head->exp);while(1){printf("[%0.0f][%d]\t",t->coef,t->exp);t=t->next;i++;if(t==head) break;}}polynode *POLYADD(polynode *A,polynode *B) {int i,j,k;polynode *ptr,*q,*q1,*q2;float x;q1=A;q2=B;q=malloc(sizeof(polynode));q->coef=0;q->exp=-1;q->next=q;ptr=q;q1=q1->next;q2=q2->next;while((q1!=A)&&(q2!=B)){if(q1->exp==q2->exp){x=q1->coef+q2->coef;if(x!=0){q->next=malloc(sizeof(polynode));q=q->next;q->coef=x;q->exp=q1->exp;}q1=q1->next;q2=q2->next;}else{q->next=malloc(sizeof(polynode));q=q->next;if(q1->exp>q2->exp){q->coef=q2->coef;q->exp=q2->exp;q2=q2->next;}else{q->coef=q1->coef;q->exp=q1->exp;q1=q1->next;}}}while(q1!=A){q->next=malloc(sizeof(polynode));q=q->next;q->coef=q1->coef;q->exp=q1->exp;q1=q1->next;}while(q2!=B){q->next=malloc(sizeof(polynode));q=q->next;q->coef=q2->coef;q->exp=q2->exp;q2=q2->next;}q->next=ptr;return ptr;}char caiDan(){char ch;do{printf("1:Create A list\n");printf("2:Create B list\n");printf("3:Add Two Polylist\n");printf("4:Display Polylist\n");printf("5:Exit\n");printf("Please Choose:");}while(ch=getch(),ch!='1'&&ch!='2'&&ch!='3'&&ch!='4'&&ch!='5');return ch;}void main(){polynode *a,*b,*c;char ch;do{clrscr();ch=caiDan();printf("%c",ch);getch();printf("\n");switch(ch){case '1': printf("Create A list\n");a=createList();printf("A list was created successfully");getch();break;case '2': printf("Create B list\n");b=createList();printf("B list was created successfully");getch();break;case '3': c=POLYADD(a,b);printf("C(C=A+B) list was created successfully\n");getch();break;case '4': printf("A List:\t");display(a);printf("\nB List:\t");display(b);printf("\nC List:\t");display(c);getch();break;case '5': exit(0);}}while(ch!='5');}。
大数运算的C语言实现大数运算是指在计算机中处理超过计大数运算是指对非常大或者超过常规数据类型范围的整数进行运算的一种技术。
在C语言中,由于通常的整数类型范围有限,不能直接处理大数运算。
下面是一个使用C语言实现大数运算的基本示例:```c#include <stdio.h>#include <stdlib.h>#include <string.h>//定义大数结构体typedef structint *digits; // 存储每一位数字int length; // 数字的长度} BigNum;//初始化大数void initBigNum(BigNum *num)num->digits = NULL;num->length = 0;//释放大数占用的内存void freeBigNum(BigNum *num)free(num->digits);num->digits = NULL;num->length = 0;//从字符串中读取一个大数void readBigNum(BigNum *num, char *str)int len = strlen(str);int i;num->digits = (int*)malloc(len * sizeof(int)); num->length = len;for (i = 0; i < len; i++)num->digits[i] = str[len - 1 - i] - '0';}//将一个大数转换为字符串void printBigNum(BigNum *num)int i;for (i = num->length - 1; i >= 0; i--)printf("%d", num->digits[i]);}printf("\n");//大数相加BigNum addBigNum(BigNum *num1, BigNum *num2)int i, carry = 0;int len = num1->length > num2->length ? num1->length : num2->length;BigNum result;result.digits = (int*)malloc((len+1) * sizeof(int));result.length = len + 1;for (i = 0; i < len; i++)int x = i < num1->length ? num1->digits[i] : 0;int y = i < num2->length ? num2->digits[i] : 0;int sum = x + y + carry;result.digits[i] = sum % 10;carry = sum / 10;}result.digits[i] = carry;return result;int mainBigNum num1, num2, sum;char str1[100], str2[100]; printf("请输入第一个大数:"); scanf("%s", str1);printf("请输入第二个大数:"); scanf("%s", str2);initBigNum(&num1);initBigNum(&num2);initBigNum(&sum);readBigNum(&num1, str1); readBigNum(&num2, str2);sum = addBigNum(&num1, &num2); printf("计算结果为:"); printBigNum(&sum);freeBigNum(&num1);freeBigNum(&num2);freeBigNum(&sum);return 0;```以上代码实现了大数的加法运算。
软件技术基础一.项目题目当正整数的位数较多时,采用int或者long变量储存时会发生溢出。
可以采用一个单链表储存,每一位作为一个节点。
设计完成如下功能的算法并用给定数据进行测试。
(1)由一数字字符串创建对应的整数单链表;(2)输出一个由证书单链表表示的正整数;(3)实现两个多位正整数的加法运算;(4)实现两个多位正整数的乘法运算。
(1)输入要进行处理的数据(2)输出要测试的数据(3)分别调用已定义的“求和”、“求积”函数对数据进行操作(4)打印得到的结果(5)销毁所有链表(1)求字符数组长度函数:传入一个字符数组的指针,用一个指针p和一个计数变量遍历整个字符数组,返回计数变量,即为数组长度。
(2)字符串转链表函数:遍历字符串,使用尾插法将数据存入单链表中,并将字符型数据转换成整形数据,每一个节点储存一个数字。
(3)求链表长度函数:传入一个链表的头结点,用一个指针p 和一个计数变量遍历整个链表,返回计数变量,即为链表长度。
(4)读取链表指定位数字函数:传入一个链表的头结点、指定第n个节点和读取元素的地址,返回链表中第n个元素的值,赋给读取变量。
(5)将指定数字写入链表指定位函数:传入一个链表的斗节点、指定第n个元素和待写入的值,将该值赋给链表中第n个节点的数据域。
(6)逆置函数:利用一个指针p,使整个链表尾插改头插,具体过程为令p为L指向的下一结点,断开L结点使之指向NULL,再将P插到L结点后面,且P结点后移一位,再插到L结点后面,一直重复操作直到P结点指向NULL,停止操作,则逆置完成,实现链表的原地逆置。
(7)创建全零链表函数:根据指定链表长度n,创建一个全零的链表,用于后续的累加操作。
(8)进位化简函数:将链表中每一个节点的数对10取整,进位给下一个节点,本节点的数变为对自身取余,直至整个链表每一个节点的数都在0-9之间,如果节点数不够进位,则先开辟一个节点,连到链表尾部,再进行上述进位过程。
(9)加法函数:用链表储存两个大数的数据p,q,pp,pq分别为指向的下一结点,利用逆置函数分别逆置数据,当pp和pq 指向均不为NULL时,两数相加储存在新建的一个和链表中;当pp或pq一个指向为空时,另一个不为空的链表数据直接存储到新建的链表中去,此时存在进位情况,利用simple函数实现进位运算,最后逆置和链表,输出即为两数之和。
(10)乘法函数:用链表储存两个大数的数据a, b,利用逆置函数分别逆置数据,创建长度为a,b长度和减1的全0积链表,从b的第一位开始,将b的低位依次乘以a的各位,加到积链表中,b每移动以为,积链表开始累加的第一位也向右移动一位,即实现竖式乘法的移位相加,再利用simplify函数实现进位运算,最后逆置积链表,输出即为两数之积。
(11)销毁链表算法:从头结点开始,利用一个遍历指针,依次释放所有节点,直至p指向NULL。
四.测试数据(1)测试数据1(2)D1=100009;D2=900001(3)求D1+D2,D1*D2(4)测试数据2(5)D3=9999999999;D4=888888888(6)求D3+D4,D3*D4五.程序代码#include <stdio.h>#include <stdlib.h>#include <math.h>typedef int ElemType;typedef struct node{ ElemType data; //数据域struct node *next; //指针域} SLinkNode; //单链表结点类型void DestroyList(SLinkNode *L)//销毁一个链表{ SLinkNode *pre=L,*p=pre->next;while (p!=NULL){ free(pre);pre=p; p=p->next; //pre、p同步后移}free(pre);}int GetLength(SLinkNode *L)//获取链表的长度{ int i=0;SLinkNode *p=L->next;while (p!=NULL){ i++;p=p->next;}return i;}void DispList(SLinkNode *L)//输出一个链表{ SLinkNode *p=L->next;while (p!=NULL){ printf("%d ",p->data);p=p->next;}printf("\n");}int GetElem(SLinkNode *L,int i,ElemType *e)//查找链表的第i个元素{ int j=0;SLinkNode *p=L; //p指向头结点,计数器j置为0if (i<=0) return 0; //参数i错误返回0while (p!=NULL && j<i){ j++;p=p->next;}if (p==NULL) return 0; //未找到返回0else{ *e=p->data;return 1; //找到后返回1}}int WriteElem(SLinkNode *L,int i,ElemType a)//写入链表的第i个元素{ int j=0;SLinkNode *p=L; //p指向头结点,计数器j置为0if (i<=0) return 0; //参数i错误返回0while (p!=NULL && j<i){ j++;p=p->next;}if (p==NULL) return 0; //未找到返回0else{ p->data=a;//写入指定数字areturn 1; //找到后返回1}}void Create(SLinkNode*L,int n)//创建长度为n的全零链表{SLinkNode *s,*tc; int i;tc=L; //tc始终指向尾结点,初始时指向头结点for (i=0;i<n;i++){ s=(SLinkNode *)malloc(sizeof(SLinkNode));tc->next=s;s->data=0; //将s插入tc之后tc=s;}tc->next=NULL; //尾结点next域置为NULL}void CreateListR(SLinkNode *L,char a[],int n)//将给定字符数组转为链表{SLinkNode *s,*tc; int i;tc=L; //tc始终指向尾结点,初始时指向头结点for (i=0;i<n;i++){ s=(SLinkNode *)malloc(sizeof(SLinkNode));s->data=(int)(a[i]-'0'); //创建存放a[i]元素的新结点stc->next=s; //将s插入tc之后tc=s;}tc->next=NULL; //尾结点next域置为NULL}int Lens(char c[])//获取指定字符数组的长度{int i=0;char *p=c;while(*p!='\0'){i++;p++;}return i;}void Reverse(SLinkNode *L) //逆置函数,将指定链表原地逆置{ SLinkNode *p=L->next,*q;L->next=NULL;while (p!=NULL) //遍历所有数据结点{ q=p->next; //q临时保存p结点之后的结点p->next=L->next; //将结点p插入到头结点之后L->next=p;p=q;}}int Max(int a,int b)//比较两数的大小,返回最大数{return(a>b?a:b);}void Simplify(SLinkNode* L)//进位化简函数{SLinkNode *p,*q;p=L->next;q=p;while(p->next!=NULL||p->data>=10){if(p->next==NULL){q=(SLinkNode*)malloc((sizeof(SLinkNode)));q->data=0;p->next=q;q->next=NULL;}q=p->next;q->data=q->data+(int)(p->data/10);p->data=p->data%10;p=q;}}void Add(SLinkNode *p,SLinkNode *q,SLinkNode *sumhead)//加法函数{int mm=Max(GetLength(p),GetLength(q));Create(sumhead,mm);Reverse(p);Reverse(q);SLinkNode *pp=p->next,*pq=q->next,*psum=sumhead->next;while(pp!=NULL&&pq!=NULL){psum->data=pp->data+pq->data;pp=pp->next;pq=pq->next;psum=psum->next;}if((pp==NULL)){while(pq!=0){psum->data=pq->data;pq=pq->next;psum=psum->next;}}if((pq==NULL)){while(pp!=0){psum->data=pp->data;pp=pp->next;psum=psum->next;}}Reverse(p);Reverse(q);Simplify(sumhead);Reverse(sumhead);DispList(sumhead);printf("\n");}void Plus(SLinkNode *p,SLinkNode *q,SLinkNode *plushead)//乘法函数{int i,j,k;int ai,bj,ck;Reverse(p);Reverse(q);Create(plushead,(GetLength(p)+GetLength(q)-1));for(j=1;j<=GetLength(q);j++)for(k=j,i=1;i<=GetLength(p);k++,i++){GetElem(p,i,&ai);GetElem(q,j,&bj);GetElem(plushead,k,&ck);ck=ck+bj*ai;WriteElem(plushead,k,ck);}Simplify(plushead);Reverse(p);Reverse(q);Reverse(plushead);DispList(plushead);printf("\n");}int main(){SLinkNode sum,plus;SLinkNode c1head,c2head,c3head,c4head; char c1[]={"100009"};char c2[]={"900001"};char c3[]={"9999999999"};char c4[]={"888888888"};CreateListR(&c1head,c1,Lens(c1));CreateListR(&c2head,c2,Lens(c2));CreateListR(&c3head,c3,Lens(c3));CreateListR(&c4head,c4,Lens(c4));printf("第一组测试数据为\n");DispList(&c1head);DispList(&c2head);printf("\n");printf("两数之和为\n");Add(&c1head,&c2head,&sum);printf("两数之积为\n");Plus(&c1head,&c2head,&plus);printf("\n\n");printf("第二组测试数据为\n");DispList(&c3head);DispList(&c4head);printf("\n");printf("两数之和为\n");Add(&c3head,&c4head,&sum);printf("两数之积为\n");Plus(&c3head,&c4head,&plus);DestroyList(&c1head);DestroyList(&c2head);DestroyList(&c3head);DestroyList(&c4head);DestroyList(&sum);DestroyList(&plus);return 0; }六.运行结果。