C语言中实现两个大数相加
大数运算 C++编程

4.大数计算器大数是超过整数表示范围的整数,针对正整数运算,定义一个大数类,并编写两个大数类对象的加法和减法函数。
基本要求:1)编写大数类对象的构造函数和输入输出函数。
2)编写大数类对象的加法和减法运算函数。
include <iostream>#include <string>#define MAX 1000using namespace std;// 将字符串转化成一个整数数组void stoi(string str, int array[]){array[0] = str.length();for(int i = 1; i <= str.length(); i++){array[i] = str.at(str.length() - i) - '0';}}// 输出大数void dispbig(int array[]){for (int i = array[0]; i >=1 ; i--){if (array[i] != 0) break;}if (i == 0) cout << 0 << endl;for (int j = i; j >=1 ; j--){cout << array[j];}cout << endl;}// 大数加法int * sumbig(int a[], int b[]){int *c = new int[MAX];for (int k = 0; k < MAX; k++) c[k] = 0;int flag = 0;for (int i = 1; i <= ((a[0] > b[0]) ? a[0] : b[0]); i++) {c[i] = (flag + a[i] + b[i]) % 10;flag = (flag + a[i] + b[i]) / 10;}if (flag){c[i] = 1;c[0] = i;}else c[0] = i - 1;return c;}// 大数减法,int * subbig(int a[], int b[]){int *c = new int[MAX];for (int k = 0; k < MAX; k++) c[k] = 0;int flag = 0;for (int i = 1; i <= ((a[0] > b[0]) ? a[0] : b[0]); i++) {c[i] = (flag + 10 + a[i] - b[i]) % 10;if (a[i] - b[i] < 0) flag = -1;else flag = 0;}c[0] = i - 1;return c;}void main(){string sa, sb;cout << "输入两个大数:" << endl;cin >> sa >> sb;int a[MAX] = {0}, b[MAX] = {0}; stoi(sa, a);stoi(sb, b);cout << "两个大数分别为:" << endl; dispbig(a);dispbig(b);int *d = subbig(a, b);int *c = sumbig(a, b);cout << "两个大数之和为: " << endl; dispbig(c);cout << "两个大数之差为: " << endl; dispbig(d);}。
C语言计算大数相加的方法

C语⾔计算⼤数相加的⽅法本⽂实例为⼤家分享了C语⾔计算⼤数相加的具体代码,供⼤家参考,具体内容如下问题描述输⼊两个整数a和b,输出这两个整数的和。
a和b都不超过100位。
算法描述 由于a和b都⽐较⼤,所以不能直接使⽤语⾔中的标准数据类型来存储。
对于这种问题,⼀般使⽤数组来处理。
定义⼀个数组A,A[0]⽤于存储a的个位,A[1]⽤于存储a的⼗位,依此类推。
同样可以⽤⼀个数组B来存储b。
计算c = a + b的时候,⾸先将A[0]与B[0]相加,如果有进位产⽣,则把进位(即和的⼗位数)存⼊r,把和的个位数存⼊C[0],即C[0]等于(A[0]+B[0])%10。
然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果⼜有进位产⽣,则仍可将新的进位存⼊到r中,和的个位存到C[1]中。
依此类推,即可求出C的所有位。
最后将C输出即可。
输⼊格式输⼊包括两⾏,第⼀⾏为⼀个⾮负整数a,第⼆⾏为⼀个⾮负整数b。
两个整数都不超过100位,两数的最⾼位都不是0。
输出格式输出⼀⾏,表⽰a + b的值。
样例输⼊201001222010012212345678902010012220100122样例输出20100122203011233454668012#include<iostream>#include<cstring>using namespace std;int main(void){int a[401] = { 0 }, b[401] = { 0 }, c[401] = {0};int alen, blen, clen;char st[400];scanf("%s", &st);alen = strlen(st);for (int i = alen; i >= 1; i--){a[i] = st[alen - i] - '1' + 1;}scanf("%s", &st);blen = strlen(st);for (int j = blen; j >= 1; j--){b[j] = st[blen - j] - '1' + 1;}clen = alen>blen ? alen : blen;for (int i = 1; i <= clen; i++){c[i] = a[i] + b[i];}for (int i = 1; i <= clen; i++){if (c[i] >= 10){c[i + 1] = c[i + 1] + c[i] / 10;c[i] = c[i] % 10;}}if (c[clen + 1] != 0)clen++;for (int i = clen; i >= 1; i--){printf("%d", c[i]);}printf("\n");return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
C语言单链表实现大数加法和乘法

软件技术基础一.项目题目当正整数的位数较多时,采用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之间,如果节点数不够进位,则先开辟一个节点,连到链表尾部,再进行上述进位过程。
C C++两个超大数相加

一、C++的64位整数在做ACM题时,经常都会遇到一些比较大的整数。
而常用的内置整数类型常常显得太小了:其中long 和int 范围是[-2^31,2^31),即-2147483648~2147483647。
而unsigned范围是[0,2^32),即0~4294967295。
也就是说,常规的32位整数只能够处理40亿以下的数。
那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。
不同的编译器对64位整数的扩展有所不同。
基于ACM的需要,下面仅介绍VC6.0与g++编译器的扩展。
VC VC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807与0~18446744073709551615(约1800亿亿)。
对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。
当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。
但是,VC的输入输出与__int64的兼容就不是很好了,如果你写下这样一段代码:1__int64 a;2cin>>a;3cout<<a;那么,在第2行会收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的错误;在第3行会收到“error C2593: 'operator <<' is ambiguous”的错误。
那是不是就不能进行输入输出呢?当然不是,你可以使用C的写法:scanf("%I64d",&a);printf("%I64d",a);就可以正确输入输出了。
大数加法_C语言

⼤数加法_C语⾔#include<stdio.h>#include<string.h>// 预处理数值,去除前导0void prefix(char num[]){if (num[0] != '0') //没有前导0,不⽤处理{return;}char *p = num;for (; *p == '0' && *p != 0; p++); //使p移位指向第⼀个不为0的数位上if (*p == 0){num[0] = '0';num[1] = 0;}else{num[0] = *p;for (char *q = num; *p != 0; *(++q) = *(++p));}}int main(int argc,char *argv[]){int flag=0;char a[1001],b[1001]; //数字存储器int ans[1001]={0}; //和存储器int n=0; //迭代次数//获取变量scanf("%d",&n);//迭代for(int p=1;p<=n;p++){flag++;//读取两个数scanf("%s%s",a,b);//前导0的去除prefix(a);prefix(b);//获取两个字符串的长度int lena=strlen(a);int lenb=strlen(b);//使pa存储长度更⼤的字符串char *pa,*pb;if(lena<lenb){lena+=lenb;lenb=lena-lenb;lena-=lenb;//交换lena与lenb的⽬的是使pa指向的数长度更长pa=b;pb=a;}else{pa=a;pb=b;}//计算开始int upa=0;//进位器int r=0;//存储数据数组的枚举for(int i=lena,j=lenb;i>0;){//获取两个数当前的位数int na=pa[--i]-'0';int nb=j>0 ? pb[--j]-'0' : 0; //pb指向的数位更短,以此计算时可能位数不够则为0//得到当前位的和int sum=na+nb+upa;//获得进位,⽐如9+8=17>10,则视为相应位为7,前⼀位进1upa=sum/10;//存储当前位ans[r++]=sum%10;}//检测最后⼀位是否存在进位if(upa>0){ans[r++]=upa;}//输出Case #:printf("Case %d:\n",flag);//输出a + b =printf("%s + %s = ",a,b);//输出结果while(r>0){printf("%d",ans[--r]); }//换⾏if(p!=n){printf("\n\n");}else{printf("\n");}}return0;}。
两个最大数相加C语言程序_附完整源码

if (pCurrent == 0) { sscanf(buff, "%d", &temp_data); pHead->data = temp_data;பைடு நூலகம்pCurrent = new Node; pCurrent->ahead = pHead; pHead->next = pCurrent; } else { sscanf(buff, "%d", &temp_data); pCurrent->data = temp_data; pTemp = new Node; pCurrent->next = pTemp; pTemp->ahead = pCurrent; pCurrent = pTemp; } if (*pStr == ',') pStr++; else break; } // 最后将链表连接起来! pHead->ahead = pCurrent->ahead; pHead->ahead->next = pHead; return pHead; } Node* AddWithOutSign(Node* pNum1, Node* pNum2) { Node* p1 = pNum1->ahead; Node* p2 = pNum2->ahead; Node* pTail = 0; Node* pHead = 0; Node* pCurrent = 0; Node* pTemp; int temp_data; //两个都为正数,相加,并且进位。 int jw = 0; while (p1 != pNum1 && p2 != pNum2) { if (pTail == 0)
C语言实现两数相加2018-09-23

C语⾔实现两数相加2018-09-23/*给定两个⾮空链表来表⽰两个⾮负整数。
位数按照逆序⽅式存储,它们的每个节点只存储单个数字。
将两数相加返回⼀个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
⽰例:输⼊:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807*//*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){struct ListNode *p = NULL, *q = NULL, *head = NULL;int index = 0, x, y, sum = 0;while (l1 != NULL || l2 != NULL){x = (l1 != NULL) ? l1->val : 0; /*当l1⾮空时x等于l1所指向的值*/y = (l2 != NULL) ? l2->val : 0; /*当l2⾮空时y等于l2所指向的值*/sum = x + y + index; /*求和的时候记得加上⽤来进位的index*/p = (struct ListNode*)malloc(sizeof(struct ListNode));if (p != NULL) /*当节点分配成功*/{p->val = sum % 10; /*对和求余数*/index = sum / 10; /*计算是否需要进位*/p->next = NULL;}if (q == NULL) /*才产⽣了⼀个节点的时候,让head指向该节点*/{q = p;head = q;}else{q->next = p; /*将每⼀个节点连接起来*/q = p;}/*判断l1是否已经指向了⼀个空节点,这⼀步很重要,也很危险,切记不能写成if(l1->next!NULL)这样会产⽣死循环(l1和l2⼀直指向最后⼀个节点)*/if (l1)l1 = l1->next;if (l2)l2 = l2->next;}if (index == 1) /*当最后⼀个节点相加超过10了,需要再产⽣⼀个节点来完成进位*/{p = (struct ListNode*)malloc(sizeof(struct ListNode));if (p != NULL){p->val = 1;p->next = NULL;q->next = p;q = p;}}return head;}/*⼼得:*1、写过程略微复杂⼀点的程序⼀定要写好伪代码,然后在写的过程中再转化为标准C语⾔;*2、对于指针的使⽤,在指针改变指向,即移动或者交换的时候⼀定要留⼼,当指针移动的时候出现⿇烦,可以往后思考⼀步到两步,就可以发现其问题;*3、对于相似问题的求解,⼀定要学会归纳⼀个模型,即使⽤⼏⾏代码就可以实现⼀系列相似问题的求解。
两个极大正整数求和C++源程序

#include <iostream>#include <string>using namespace std;int main(){string a, b;int *sum;int i, ja, jb;cout << "请输入两个数字,每个数字以空格结尾:" << endl;cin >> a >> b;string temp;if ( a.size() > b.size() ) // 如果a长度大于b,则交换两字符串{temp = a;a = b;b = temp;}// 在这后,就肯定是a的长度比b小,所以和的位数最大就是b的位数+1。
sum = new int[b.size()+1]; // 所以给和申请b的位数+1个位置。
sum[0] = 0;char achar[1];char bchar[1];int carry = 0; // 记录进位int sizeDif = b.size() - a.size(); // 记录两个数字的位数差int count; // 记录和的位数for ( ja = a.size()-1, jb = b.size()-1; ja >= 0; ja--, jb-- ){achar[0] = a[ja];bchar[0] = b[jb];sum[jb+1] = atoi(achar) + atoi(bchar) + carry;carry = 0; // 清空进位标志位if( sum[jb+1] > 9 ){carry = 1;sum[jb+1] -= 10; // 使之成为一位数,方便输出。
}}for ( i = sizeDif-1; i >= 0 ; i-- ){bchar[0] = b[i];sum[i+1] = atoi(bchar)+carry; // 转换为数字carry = 0; // 清空进位标志位if( sum[i+1] > 9 ){carry = 1;sum[i+1] -= 10; // 使之成为一位数,方便输出。
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语言两个大数相加

目的:实现两个超大数的相加例如:1000000000000000+245=方法:单链表步骤:1.先创建一个结构体类型作为链表的节点。
typedef char ElemType;//定义ElemType为字符类型typedef struct tagNode{ElemType data;//存贮数据struct tagNode * next;//节点指针}Node,* LinkList;2.在创建一个函数creatLink(),目的是将输入的数据都存在一个链表里。
//尾插法创建链表,以便于个位数的相加Node *createLink(){LinkList head,s,l;//创建节点char c;int i=0;while((c=getchar())!='=')//当输入为=时,存储结束{//创建节点;s=(LinkList)malloc(sizeof(Node));s->data=c;s->next=NULL;i++;if(i==1){//设置i是为了使第一个节点中存有数据l=s;continue;//当i=1时,代码不在往下执行,重新跳转到创建节点 }s->next=l;l=s;}return l;//返回节点头指针}3.创建函数*visitLink(LinkList l)返回+后面的节点的指针地址//查阅链表找到+所在的位置Node *visitLink(LinkList l){LinkList s,head;//head代表+紧跟的之后的节点。
while(1){if(l->data=='+'){head=l->next;break;}l=l->next;}return head;}4.在主函数中将通过3和2步骤获得的链表的各个节点进行相加并打印出来。
int main (){LinkList head1,head2,head3,s;int i=0,sum,head1_i,head2_i;//head1_i,head2_i分别代表各自链表节点的数据值。
大数加法(C++实现)

⼤数加法(C++实现)最常规的⼤数加法 (两个数都是⾮负的整数)思路:⽤字符串的⽅式去存储我们需要计算的数,但是要注意的⼀点就是我们是倒过来存储这个⼤数的⽐如: 123456789 我们存储的时候是存成 987654321为什么要这么⼲?我觉得是为了便于后⾯我们的进位操作吧最常规的⼤数加法 (两个数都是⾮负的整数)1 #include<iostream>2 #include<cstring>3 #include<algorithm>4 using namespace std;5 const int L=110;6 string add(string a,string b)//只限两个⾮负整数相加7 {8 string ans;9 int na[L]={0},nb[L]={0};10 int la=a.size();11 int lb=b.size();12 // 倒叙存储13 for(int i=0;i<la;i++)14 na[la-1-i]=a[i]-'0';15 // 倒叙存储16 for(int i=0;i<lb;i++)17 nb[lb-1-i]=b[i]-'0';18 int lmax=la>lb?la:lb;19 // 从个位开始计算20 for(int i=0;i<lmax;i++)21 {22 na[i]+=nb[i];23 na[i+1]+=na[i]/10;24 na[i]%=10;25 }26 // 去除前置027 if(!na[lmax])28 lmax--;29 for(int i=lmax;i>=0;i--)30 ans+=na[i]+'0';31 return ans;32 }33 int main()34 {35 string a,b;36 while(cin>>a>>b)37 cout<<add(a,b)<<endl;38 return 0;39 }【变形⼀】正负整数的⼤数的加法思路:⼤体的思路和常规的⼤数加法还是⼀样的,唯⼀不同的就是多了对最后结果的判断(是正数还是负数)1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include <iostream>5 #include <cstring>67 using namespace std;89 const int maxn = 10010;11 char a[maxn],b[maxn];12 int aa[maxn],bb[maxn];131415 void add(char str1[],char str2[])16 {17 memset(aa,0, sizeof(aa));18 memset(bb,0, sizeof(bb));19 int len1 = strlen(str1);20 int len2 = strlen(str2);21 int flag1 = 0,flag2 = 0;22 // 都是0的时候特殊处理23 if (str1[0] == '0' && str2[0] == '0')24 printf("0\n");25 else26 {27 // str1是负数28 if (str1[0] == '-')29 {30 flag1 = 1;31 for (int i=0;i<len1-1;i++)32 {33 aa[i] = str1[len1-1-i] - '0'; //倒叙记录34 }35 }36 else37 {38 // str1是正数39 for (int i=0;i<len1;i++)40 {41 aa[i] = str1[len1-1-i] -'0';42 }43 }4445 //str2是负数46 if (str2[0] == '-')47 {48 flag2 = 1;49 for (int i=0;i<len2-1;i++)50 {51 bb[i] = str2[len2-1-i] - '0';52 }53 }54 else55 {56 // str2是正数57 for (int i=0;i<len2;i++)58 {59 bb[i] = str2[len2-1-i]- '0';60 }61 }6263 //分四种情况对str1,str2处理6465 if (!flag1 && !flag2) //str1 和 str2都是正数66 {67 int len = max(len1,len2);68 for (int i=0;i<len;i++)69 {70 bb[i] += aa[i];71 bb[i+1] += bb[i]/10;72 bb[i]%=10;73 }74 //处理前置零75 while (!bb[len])76 len--;77 for (;len>=0;len--)78 printf("%d",bb[len]);79 printf("\n");80 }81 else if (!flag1 && flag2) // str1是正数,str2是负数82 {83 int ans = 0;84 //判断str1和str2的绝对值谁⼤谁⼩85 if (len1>len2-1)86 ans = 1;87 else if (len1 == len2-1)88 {89 for (int i=len1-1;i>=0;i--)90 {91 if (aa[i]>bb[i])92 {93 ans = 1;95 }96 else if (aa[i]<bb[i])97 {98 ans = 0;99 break;100 }101 }102 }103 // 如果str1的绝对值更⼤104 if (ans)105 {106 for (int i=0;i<len1;i++)107 {108 aa[i] -= bb[i];109 while (aa[i]<0)110 {111 aa[i] += 10;112 aa[i+1]--;113 }114 }115 //处理前置零116 while (!aa[len1])117 len1--;118 for (;len1>=0;len1--)119 printf("%d",aa[len1]);120 printf("\n");121 }122 else // 如果str2的绝对值更⼤123 {124 for (int i=0;i<len2-1;i++)125 {126 bb[i] -= aa[i];127 while (bb[i]<0)128 {129 bb[i]+=10;130 bb[i+1]--;131 }132 }133 //处理前置零134 while (!bb[len2])135 len2--;136 if (len2<0) // 注意333 -333 的情况137 printf("0\n");138 else139 {140 for (;len2>=0;len2--)141 printf("%d",bb[len2]);142 printf("\n");143 }144 }145 }146 else if (flag1 && !flag2) //str1为负数 str2为正数147 {148 int ans = 0;149 // 判断str1 和 str2 的绝对值的⼤⼩150 if (len2>len1-1)151 {152 ans = 1;153 }154 else if (len2 == len1-1)155 {156 for (int i = len2 - 1; i >= 0; i--)157 {158 if (aa[i] > bb[i])159 {160 ans = 0;161 break;162 }163 else if (bb[i] > aa[i])164 {165 ans = 1;166 break;167 }168 }169 }170 //判断结果的正负171 if (ans)172 {173 for (int i=0;i<len2;i++)174 {175 bb[i] -= aa[i];176 while (bb[i]<0)177 {179 bb[i+1]--;180 }181 }182 //处理前置0183 while (!bb[len2])184 len2--;185 for (;len2>=0;len2--)186 printf("%d",bb[len2]);187 printf("\n");188 }189 else190 {191 for (int i=0;i<len1-1;i++)192 {193 aa[i] -= bb[i];194 while (aa[i]<0)195 {196 aa[i]+=10;197 aa[i+1]--;198 }199 }200 //处理前置0201 while (!aa[len1])202 len1--;203 if (len1<0) // 注意333 -333 的情况204 printf("0\n");205 else206 {207 printf("-");208 for (;len1>=0;len1--)209 {210 printf("%d",aa[len1]);211 }212 printf("\n");213 }214 }215 }216 else if (flag1 && flag2) // 都是负数217 {218 printf("-");219 int len = max(len1,len2);220 for (int i=0;i<len-1;i++)221 {222 bb[i] += aa[i];223 bb[i+1] += bb[i]/10;224 bb[i]%=10;225 }226 while (!bb[len])227 len--;228 for (;len>=0;len--)229 printf("%d",bb[len]);230 printf("\n");231 }232 }233 }234235236237238239 int main()240 {241 while (cin >> a >> b)242 {243 add(a,b);244 }245 return 0;246 }【变形⼆】正⼩数的⼤数加法思路:我们把⼩数部分和整数部分分开来考虑1 #include<stdio.h>2 #include<string.h>4 #include <iostream>5 #include <cstring>67 using namespace std;89 int len,len1,len2,i,j,k,x1,x2,y1,y2,m,n;10 char str1[450],str2[450];11 int a1[450],a2[450],a3[450],b1[450],b2[450],b3[450],a[450],b[450],c[450];121314 void add(char str1[],char str2[])15 {16 memset(a1,0, sizeof(a1));17 memset(a2,0, sizeof(a2));18 memset(a3,0, sizeof(a3));19 memset(b1,0, sizeof(b1));20 memset(b2,0, sizeof(b2));21 memset(b3,0, sizeof(b3));22 memset(a,0, sizeof(a));23 memset(b,0, sizeof(b));24 memset(c,0, sizeof(c));25 len1 = strlen(str1);26 len2 = strlen(str2);27 //找到str1⼩数点28 for (i=0;i<len1;i++)29 {30 if (str1[i] == '.')31 break;32 }33 //存储str1⼩数部分34 for (k=len1-1,j=0;k>i;k--,j++)35 {36 a1[j] = str1[k] -'0';37 }38 x1 = j; //记录a1的长度(⼩数部分)39 i = i - 1;40 //存储str2整数部分41 for (j=0;i>=0;i--,j++)42 {43 a2[j] = str1[i] - '0';44 }45 x2 = j; //记录a2数组的长度(整数部分)4647 //找到str1的⼩数点48 for (i=0;i<len2;i++)49 {50 if (str2[i] == '.')51 break;52 }53 //存储str2⼩数部分54 for (k=len2-1,j=0;k>i;k--,j++)55 {56 b1[j] = str2[k]-'0';57 }58 y1 = j; //记录b1的长度(str2的⼩数部分)59 i = i - 1;60 // 存储str2的整数部分61 for (j=0;i>=0;i--,j++)62 {63 b2[j] = str2[i] - '0';64 }65 y2 = j; //记录b2的长度(str2的整数部分)6667 // 对齐⼩数部分68 if (x1<=y1)69 {70 m = y1 - x1;71 n = y1;72 for (i = 0; i < x1; i++)73 {74 a3[i + m] = a1[i];75 }76 for (i = 0; i < y1; i++)77 {78 b3[i] = b1[i];79 }80 }81 else82 {83 m = x1 - y1;84 n = x1;85 for (i = 0; i < y1; i++)86 {88 }89 for (i=0;i < x1;i++)90 {91 a3[i] = a1[i];92 }93 }9495 //计算⼩数部分96 for (i=0;i<n;i++)97 {98 b[i] += a3[i]+b3[i];99 b[i+1] += b[i]/10;100 b[i] = b[i]%10;101 }102 //第⼀位的⼩数需要进位103 if (b[n] == 1)104 {105 a2[0]+=1;106 b[n]=0;107 }108109 //计算整数部分110 if (x2>=y2)111 m=x2;112 else113 m=y2;114 for (i=0;i<m;i++)115 {116 a[i]+=b2[i]+a2[i];117 a[i+1]+=a[i]/10;118 a[i]%=10;119 }120121 //处理整数的前置0122 for (i=m+5;i>=0&&a[i]==0;i--)123 {124 ;125 }126 //存在不为0的部分127 if (i>=0)128 {129 for (;i>=0;i--)130 printf("%d",a[i]);131 }132 else //整数部分是0133 {134 printf("0");135 }136137 //处理⼩数的后置0138 k = 0;139 for (k=0;k<n&&b[k]==0;k++)140 {141 ;142 }143 //如果第n-1个还是0,那么则说明⼩数部分不存在144 if (k!=n)145 {146 printf(".");147 for (int i=n-1;i>=k;i--)148 {149 printf("%d",b[i]);150 }151 }152 printf("\n");153 }154155156157158159 int main()160 {161 while (cin >> str1 >> str2)162 {163 add(str1,str2);164 }165 return 0;166 }。
c语言两个大数相加

head=l->next; break; } l=l->next; } return head; } 4.在主函数中将通过 3 和 2 步骤获得的链表的各个节点进行相加并打印出来。 int main () { LinkList head1,head2,head3,s; int i=0,sum,head1_i,head2_i;//head1_i,head2_i 分别代表各自链表节点的数据值。 head1=(LinkList)malloc(sizeof(Node)); head1=createLink(); head2=visitLink(head1); //计算加法 while(1) { //(head2!=NULL)&&(head1->data!='+') //分别检验 head2 是否为零和 head1 的数据值是否为+ //如果 head 是零,那就等到 head1 的数据值为+然后 break //如果 head1 的数据先为+则等到 head2 为零然后 break //当 head1 为零且 head1 的数据是+则 break 退出 if((head2==NULL)&&(head1->data=='+')) { if(i==1)printf("%d",i);//i 为进位 为了防止两个数的最高位相加大于 10 break; } if(head2==NULL) head2_i=0;//当 head2==NULL 即为该节点后面已经没有节点了且该 节点的数据位没有存贮数据。 else head2_i=(int)(head2->data-48);//否则的化就将该节点的数据拿出来.减 48 视为了将 char 类型转换成 int 类型,在 ascII 中。 if(head1->data=='+')head1_i=0; else head1_i=(int)(head1->data-48); sum=i+head2_i+head1_i;//sum 代表两个数的相同位的数的相加例如俩个数的个位的 相加 if(sum>9) { i=1;//如果 sum 大于九则代表应该有进位。 sum=sum-10; }
2个超大整数相加

void deletelist(Num *head){
Num *node=head,*next;
while(node){
next=node->upper;
free(node);
node=next;
}
}
void printlist(Num *head){
Num *node=head;
char *h=s;
Num *node,*lastnode=NULL,*head;
s+=strlen(s)-1;
while(s>=h){
node=(Num *)malloc(sizeof(Num));
if(*s>='0'&&*s<='9')
node->n=*s-'0';
printlist(op2);
printf("\n = \n");
printlist(res);
printf("\n");
deletelist(op1);
deletelist(op2);
deletelist(res);
return 0;
}
�
n2=n2->upper;
}else
opnum2=0;
node->n=(opnum1+opnum2+carry)%10;
carry=(opnum1+opnum2+carry)>=10?1:0;
node->upper=NULL;
if(lastnode){
c语言大数加减法运算函数

c语言大数加减法运算函数在C语言中,由于整数类型的范围是有限的,所以当需要进行大数加减法运算时,我们通常需要使用字符串来表示大数,并编写函数来实现这些运算。
以下是一个简单的示例实现:c.#include <stdio.h>。
#include <string.h>。
// 倒转字符串。
void reverse(char num) {。
int len = strlen(num);for (int i = 0; i < len / 2; i++) {。
char temp = num[i];num[i] = num[len i 1];num[len i 1] = temp;}。
}。
// 大数加法。
char bigIntAdd(char num1, char num2) {。
int len1 = strlen(num1);int len2 = strlen(num2);int len = len1 > len2 ? len1 : len2;int carry = 0;char result = (char)malloc(sizeof(char) (len + 2));int index = 0;for (int i = len1 1, j = len2 1; i >= 0 || j >= 0 || carry; i--, j--) {。
int digit1 = i >= 0 ? num1[i] '0' : 0;int digit2 = j >= 0 ? num2[j] '0' : 0;int sum = digit1 + digit2 + carry;result[index++] = sum % 10 + '0';carry = sum / 10;}。
result[index] = '\0';reverse(result);return result;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、源程序(实验过程或算法) #include <stdio.h> #include <string.h> #define N 200 void main() {char s1[N],s2[N]; int a[N]={0},b[N]={0},l1,l2,c,k,i; puts("请输入两个较大的数字(Note:输完一个按一次回车):"); gets(s1); gets(s2); l1=strlen(s1); l2=strlen(s2); if(l1<l2) k=l2;
实验体会:此次实验让我体会到字符串的妙用,通过其所作的和运算,避 免了数据溢出,实现了很大数的求和。所以,在以后的学习中,可以尽可 能的探索,把已知的知识串联起来,就能得到意想不到的收获!!
创建时间:2022-4-27 5:22:00
1. 掌握数组的定义、初始化、以及数组元素的引用方法 2. 掌握使用数组表示相关同类数据以及相应的程序设计基本方法 3. 掌握字符数组的定义、输入、输出 4. 掌握字符串有关的标准库函数的使用
二、实验项目内容(实验题目)
在实际的工程应用中常常出现超过系统整型数据类型表示范围的大整数,所以有必要 研究大整数在程序中的处理方法。请编制程序实现功能:利用字符数组实现两个大整 数的加法。
创建时间:2022-4-27 5:22:00
else k=l1;c=k; for(i=0;i<l1;k--,i++)
a[k]=s1[l1-1-i]-'0'; for(k=c,i=0;i<l2;k--,i++)
b[k]=s2[l2-1-i]-'0'; printf("\n"); for(i=c;i>=0;i--) {a[i]+=b[i]; if(a[i]>=10) {a[i]-=10; a[i-1]++;} } printf("此两数相加之和为:"); if(a[0]!=0)
{for(i=0;i<=c;i++) printf("%d",a[i]);} else
{for(i=1;i<=c;i++) printf("%d",a[i]);} printf("\n"); } 四、源程序调试过程和(或)实验分析 第一次运行过程:
创建时间:2022-4-27 5:22:00
第二次运行过程:
实验题目
C 语言基本控制结构应用
实验时间 2011 年 5 月 19 日 实验地点
DS1421
实验成绩
实验性质
□验证性 √设计性 □综合性
教师评价:
□算法/实验过程正确; □源程序/实验内容提交 □程序结构/实验步骤合理;
□实验结果正确;
□语法、语义正确名:
一、实验目的