精华内容
下载资源
问答
  • 大数相加 C语言

    2021-01-26 16:36:00
    用链表对两个大数进行相加 输入的第一个数字是数的位数 例子: 创建结点 struct node {//链表结点类型,包含一个存放整型数据的 data 成员,和一个指向下一个结点的next成员 int data ; struct node *next ; }; ...

    用链表对两个大数进行相加

    输入的第一个数字是数的位数
    例子:
    example

    创建结点

    struct node
    {//链表结点类型,包含一个存放整型数据的 data 成员,和一个指向下一个结点的next成员
        int data ;
        struct node *next ;   
    };
    
    

    创建空链表

    struct node *mycreateList()
    {//函数功能:创建一个只有一个头结点的空链表,头节点的数据域赋值为0,并将表头结点的地址返回
      struct node *head = (struct node *)malloc(sizeof(struct node));
      head->data = 0;
      head->next = NULL;
      return head;
    }
    

    链表头插法

    void myinsertHead(struct node * head, int insData )
    {
    	/*函数功能:实现在head为表头的链表中使用头插法,插入数据元素insData*/
       struct node *p ;
       p = (struct node *)malloc(sizeof(struct node));
       p->data = insData;
       p->next = head->next ;
       head->next = p ;
    }
    

    链表尾插法

    void myinsertTail(struct node *  head , int insData )
    {
    	/*在head为表头的单链表表尾插入数据元素insData*/
       struct node *p ,*q ;
       p = (struct node *)malloc(sizeof(struct node));
       p->data = insData;
       p->next = NULL;
       
       q = head ;
       while(q->next!=NULL) 
        { 
        	q = q->next;
        }
       q->next = p ;
    }
    

    输出大数相加的结果

    void myprintList(struct node *L)
    {
         /*输出head为表头的链表中的数据元素*/
    	struct node *p = L->next ;
    	while(p)
    	 {
    	  printf("%d ",p->data);
    	  p = p->next ;
          }
    }
    

    接收大数的各个位

    将大数的各个位用头插法插入链表,因为在进行大数相加的时候,我们是从低位往高位进行相加,方便后面对两个大数进行相加。

    void genNumber( struct node *A , int num)
    {//接收输入的大数的各个位
        int i;
        int data;
        printf("请输入大数的各个位(用空格隔开)\n");
    	for(i=0;i<num;i++)//使用头插法 
    	{
    		scanf("%d",&data);
    		myinsertHead(A,data);
    	 } 
         return;
    }
    

    两个大数相加

    struct node *addNumber(struct node *A ,struct node *B)
    {
        //求两数相加之和
        struct node *p1,*p2,*p,*head;
        p1=A->next;
        p2=B->next;
        p=mycreateList();
        head=p;
        int sum=0,count=0;//count表示各个位相加是否有进位
        while(p1!=NULL||p2!=NULL)//使用头插法 
        {
        	if(p1!=NULL&&p2!=NULL)
        	{
        		sum=p1->data+p2->data;
        		if(count==0)
        		{
        			if(sum>=10)
        			{
        				sum=sum%10;
        				count=1;
    				}
    				else
    				{
    					count=0;
    				}
    				myinsertHead(p,sum);
    			}
    			else
    			{
    				sum=sum+1;
    				if(sum>=10)
    				{
    					sum=sum%10;
    					count=1;
    				}
    				else
    				{
    					count=0;		
    				}
    				myinsertHead(p,sum);
    			}
    			p1=p1->next;
    			p2=p2->next;
    		}
    		
    		if(p1==NULL&&p2!=NULL)//p1代表的数比较小 
    		{
    			sum=p2->data;
    			if(count==0)
    			{
    				myinsertHead(p,sum);
    			}
    			else
    			{
    				sum=sum+1;
    				if(sum>=10)
    				{
    					sum=sum%10;
    					count=1;
    				}
    				else
    				{
    					count=0;
    				}
    				myinsertHead(p,sum);
    			}
    			p2=p2->next;
    		}
    		
    		if(p1!=NULL&&p2==NULL)//p2代表的值比较小 
    		{
    			sum=p1->data;
    			if(count==0)
    			{
    				myinsertHead(p,sum);
    			}
    			else
    			{
    				sum=sum+1;
    				if(sum>=10)
    				{
    					sum=sum%10;
    					count=1;
    				}
    				else
    				{
    					count=0;
    				}
    				myinsertHead(p,sum);
    			}
    			p1=p1->next;
    		}
    	}
    	if(count==1)
    	{
    		myinsertHead(p,1);
    	}
    	return head;
    }
    
    

    主函数

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
      struct node *A ,*B ,*C ;
      int i,j;
      A = mycreateList();
      B = mycreateList();
      printf("请输入第一个数的位数:\n");
      scanf("%d",&i);  
      genNumber(A,i);
      
      printf("请输入第二个数的位数:\n");
      scanf("%d",&j);  
      genNumber(B,j) ;
      
      
      C = addNumber(A,B);
      printf("两数相加后的结果:\n");
      myprintList(C);  
    return 0;    
    }
    
    
    展开全文
  • 两个大数相加 C语言

    2011-03-16 19:07:00
    以下代码是以自己的思路完成的两个大数相加   #include <string.h><br />#include <stdio.h><br />#define MAX 400 int add_one[MAX]={0}; int add_two[MAX]={0}; int add_result...

    以下代码是以自己的思路完成的两个大数相加

     

    #include <string.h>
    #include <stdio.h>

    #define MAX 400

    int add_one[MAX]={0};
    int add_two[MAX]={0};
    int add_result[MAX]={0};

    bool check(int * add_array,int position)
    {
     int che = 0;
     for(int y = position;y < MAX;y++)
      if(add_array[y] == 0)
       che += 1;

     return position + che < MAX ? false : true;
    }
    int check_position(int * array)
    {
     int ci = 0;
     for(int i = 0; i < MAX;i++)
     {
      if(check(array,i))
      {
       ci = i;
       break;
      }
     }
     return ci - 1;
    }
    void input_array(int *array)
    {
     int cin = 0;
     for(int i = 0;i < MAX;i++)
     {
      scanf("%d",&cin);
      if(cin < 0)
       break;
      else
       array[i] = cin;
     }
    }
    void printf_array(int *array)
    {
     int po = check_position(array);
     for(int a = po;a >= 0;a--)
     { 
      printf("%d",array[a]);
     }
    }
    void add(int *add_one,int*add_two,int one,int two)
    {

     int s = 0;
     s = (one < two ? two : one);
     for(int k = 0 ;k < s + 1;k++)
     {
      if(one >= 0 && two >= 0)
      {
       add_result[k] = add_result[k] + add_one[one--] + add_two[two--];
      }else if (one >= 0 && two < 0)
      {
       add_result[k] = add_result[k] + add_one[one--];
      }else if (one < 0 && two >= 0)
      {
       add_result[k] = add_result[k] + add_two[two--];
      }
      
      if(add_result[k] >= 10)
      {
       add_result[k] -= 10;
       add_result[k + 1] += 1;
      }
     }
    }
    void main()
    {

     input_array(add_one);
     input_array(add_two);
     
     int one = check_position(add_one);
     int two = check_position(add_two);
     add(add_one,add_two,one,two);

     printf_array(add_result);

    }

    展开全文
  • #include #include #include char a[10000],b[10000],c[10000]; char a1[10000],b1[10000]; char temp[10000],temp1[1000]; #define max(a,b) a>b? a:b #define min(a,b) a void reverse(char a[]) ...
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    char a[10000],b[10000],c[10000];
    char a1[10000],b1[10000];
    char temp[10000],temp1[1000];
    #define max(a,b) a>b? a:b
    #define min(a,b) a<b? a:b
    void reverse(char a[])
    {
        char d[10000];
        int len=strlen(a);
        int j=len-1;
        for(int i=0;i<len;i++)
        {
            d[j]=a[i];
            j--;
        }
        for(int i=0;i<len;i++)
        {
            a[i]=d[i];
        }
    
    }
    void add(char a[],char b[])
    {
        reverse(a);
        reverse(b);
    
        int len1=strlen(a);
        int len2=strlen(b);
        for(int i=0;i<len1;i++)
            a1[i]=a[i];
        for(int i=0;i<len2;i++)
            b1[i]=b[i];
        if(len2>len1)//把数的位数用0填充至一样多
        {
            for(int i=len1;i<len2;i++)
            {
                a1[i]='0';
            }
        }
        if(len1>=len2)
        {
            for(int i=len2;i<len1;i++)
            {
                b1[i]='0';
            }
        }
        //printf("%s %s\n",a1,b1);
        int len=max(len1,len2);
        for(int i=0;i<len;i++)
        {
            if(i>0)
            {
            temp[i]=a1[i]-'0'+b1[i]-'0'+temp1[i-1];
            if(temp[i]>=10)
            {
            temp1[i]=temp[i]/10;//大于十就往前进
            temp[i]=(a1[i]-'0'+b1[i]-'0'+temp1[i-1]-10*temp1[i]);//剩下来的个位数
            }
            }
            if(i==0)
            {
            temp[i]=a1[i]-'0'+b1[i]-'0';
            if(temp[i]>=10)
            {
            temp1[i]=temp[i]/10;
            temp[i]=(a1[i]-'0'+b1[i]-'0'-10*temp1[i]);
            }
            }
            c[i]=temp[i]+'0';
            //printf("%d %d %c\n",temp[i],temp1[i],c[i]);
        }
        if(temp1[len-1]>0)
            c[len]=temp1[len-1]+'0';
        reverse(c);
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
                for(int i=1;i<=n;i++)
                {
                  scanf("%s %s",&a,&b);
                  memset(temp,0,sizeof(temp));
                  memset(temp1,0,sizeof(temp1));
                  add(a,b);
                  reverse(a);
                  reverse(b);
                  printf("Case %d:\n%s + %s = %s",i,a,b,c);
                  int len=strlen(c);
                  for(int i=0;i<len;i++)
                  {
                      c[i]='\0';
                  }
                  if(i!=n)
                    printf("\n\n");
                  if(i==n)
                    printf("\n");
                }
                return 0;
    
        }
        return 0;
    }
    

    已AC

    就是模拟一个竖式运算,思路很清晰,只是代码较长。。。

    展开全文
  • 大数相加 - C语言

    2020-10-24 23:02:02
    大数相加c语言链式栈表示。 代码如下: #include #include #include typedef struct StackNode //链式栈结构体 { char data; struct StackNode *next; }SqStack,*LinkStack; void InitStack(LinkStack &S)//栈的...

    大数相加–c语言链式栈表示。
    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct StackNode //链式栈结构体 
    {
    	char data;
    	struct StackNode *next; 
    }SqStack,*LinkStack;
    
    void InitStack(LinkStack &S)//栈的初始化,只有创建一个栈顶结点这一步 
    {
    	S = (SqStack*)malloc(sizeof(SqStack));//创建一个野结点,使其为NULL,便成为栈顶结点。 
    	S = NULL;
    }
    
    void Push(LinkStack &S,char e)//进栈 
    {
    	SqStack* p;//定义一个野结点 
    	p = (SqStack*)malloc(sizeof(SqStack));
    	p->data = e;//使该结点装上数据元素e,并使其next等于S,类似于链表的头插法 
    	p->next = S;
    	S = p;//栈顶结点S,一直在栈的最前方 
    }
    
    char Pop(LinkStack &S)//使栈顶元素出栈,并返回栈顶元素 
    {
    	char a,b = '0';
    	if(S==NULL)//判断栈是否为空 
    		return b;
    	else
    	{
    		SqStack* p;//这里定义一个结点,方便后面对栈顶结点的释放 
    		a = S->data;//栈顶数据赋值 
    		p = S;
    		S = S->next;//使栈顶结点指向下一个结点,类似于栈减一 
    		p->next = NULL;
    		free(p);//释放栈顶元素 
    		return a;//返回栈顶原素 
    	}	
    }
    
    void InputNumber(LinkStack &S,LinkStack &L)//数的输入 
    {
    	char a,b;
    	printf("1请输入:");//第一个数据的输入 
    	while(1)
    	{
    		scanf("%c",&a);
    		if(a == '\n')//当检测到enter键时终止死循环 
    			break;
    		Push(S,a);//进栈 
    	}
    	printf("2请输入:");//第二个数据的输入 
    	while(1)
    	{
    		scanf("%c",&b);
    		if(b == '\n')
    			break;
    		Push(L,b);
    	}
    }
    
    void Addition(LinkStack S,LinkStack L)//两数相加操作 
    {
    	LinkStack T;
    	InitStack(T);//申请一个新栈,用于装两数相加的和 
    	int m,n = 0;
    	while(1)//两数相加,并导入栈T中 
    	{
    		n = (int)(Pop(S)) + (int)(Pop(L)) + n - 96;//int(2) == 50; 
    		m = n%10+48;
    		if(n/10)
    			n = 1;
    		else
    			n = 0;
    		Push(T,char(m));
    		if(S == NULL && L == NULL)
    			break;
    	}	
    	while(T != NULL)//利用循环打印T出栈的数据 
    	{
    		printf("%c",Pop(T));
    	}
    }
    
    int main()
    {
    	LinkStack S,L;
    	InitStack(S);//初始化两栈,来装加数和被加数 
    	InitStack(L);
    	InputNumber(S,L);//输入操作 
    	Addition(S,L);//相加操作 
    	return 0;
    }
    

    不过链式栈太浪费空间了,这里再用顺序栈来表示一下。
    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXSIZE 10000 //静态顺序栈存储的最大空间 
    
    typedef struct 
    {
    	char data[MAXSIZE];//静态顺序栈可用的最大容量 
    	int top;//栈顶 
    }SqStack;
    
    void InitStack(SqStack &S)//栈的初始化 
    {
    	S.top = -1;//静态顺序栈中,使S.top=-1便是对栈的初始化 
    }
    
    int Push(SqStack &S,char e)//进栈 
    {
    	if(S.top==MAXSIZE-1)//判断栈是否为满 
    	{
    		printf("栈满!\n");
    		return 0;
    	}
    	S.data[++S.top]=e;//S.top自加一,使S.top=0,使输入的e值导入栈中 
    	return 0; 
    }
    
    char Pop(SqStack &S)//使栈顶元素出栈,并返回栈顶元素,且栈长减一 
    {
    	if(S.top == -1)
    		return '0';
    	return S.data[S.top--];
    }
    
    void InputNumber(SqStack &S,SqStack &L)//数的输入 
    {
    	char a,b;
    	printf("1请输入:");//第一个数据的输入 
    	while(1)
    	{
    		scanf("%c",&a);
    		if(a == '\n')//当检测到enter键时终止死循环 
    			break;
    		Push(S,a);//进栈 
    	}
    	printf("2请输入:");//第二个数据的输入 
    	while(1)
    	{
    		scanf("%c",&b);
    		if(b == '\n')
    			break;
    		Push(L,b);
    	}
    }
    
    void Addition(SqStack S,SqStack L)//两数相加操作 
    {
    	SqStack T;
    	InitStack(T);//申请一个新栈,用于装两数相加的和 
    	int m,n = 0;
    	while(1)//两数相加,并导入栈T中 
    	{
    		n = (int)(Pop(S)) + (int)(Pop(L)) + n - 96;//int(2) == 50; 
    		m = n%10+48;
    		if(n/10)
    			n = 1;
    		else
    			n = 0;
    		Push(T,char(m));
    		if(S.top == -1 && L.top == -1)
    			break;
    	}	
    	while(T.top != -1)//利用循环打印T出栈的数据 
    	{
    		printf("%c",Pop(T));
    	}
    }
    
    int main()
    {
    	SqStack S,L;
    	InitStack(S);//初始化两栈,来装加数和被加数 
    	InitStack(L);
    	InputNumber(S,L);//输入操作 
    	Addition(S,L);//相加操作 
    	return 0;
    }
    

    代码不难,只是没加输入挑选工作,所以只能输入纯数字。
    (完)

    展开全文
  • 大数相加c语言

    2019-04-14 16:27:10
    #include #include void main() { int num_a[500]={0};//数组初始化一定要 ...// 输出大数相加结果 // 一定要从最高位输出 for(i=maxIndex;i >= 0;i--) { printf("%d",result[i]); } }  
  • c语言大数相加

    2014-05-04 11:35:19
    一个运用c语言写的大数相加程序,可以实现大数的四则运算,拥有详尽的代码注释,相信可以帮助很多同学。
  • 用字符串模拟大数,只需注意进位,使用了栈。 代码: 1 #include<stdio.h> 2 #include<string.h> 3 char A[99999]; 4 char B[99999]; 5 char sum[99999]="0"; 6 void add() 7 { 8 ...
  • #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &...//long int型指针(Number)指向一个long int 数组,索引值最底的位, //为1...
  • 给定两个字符串形式的非负整数num1 和num2,计算它们的和。 注意: num1 和num2的长度都小于 5100. num1 和num2 都只包含数字0-9. num1 和num2 都不包含任何前导零。 你不能使用任何內建 BigInteger 库,也不能...
  • 大数相加C语言

    2008-09-21 17:59:00
    #define N 100#include "stdio.h"#include "string.h"main(){ char a[N],b[N]; int a1[N]={0},b1[N]={0},c[N]={0}; int i,j,k,n,m,x; printf("输入数据a:/n"); gets(a); n=strlen(a); printf("输入数据b:/n")...
  • C语言处理大数相加

    2019-12-16 20:42:23
    C语言处理大数相加C语言中,当两个数超过长整形即long int的数据上限时,要完成求和,就无法用简单的运算符进行计算,此时要将其用字符串处理。代码如下: #include<stdio.h> #include<string.h>...
  • C语言实现大数相加

    2019-10-13 16:07:35
    C语言实现大数相加 //利用栈来实现大数相加 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char s1[100]; char s2[100]; printf("请分别输入你的s1,s2\n"); gets(s1...
  • C语言 大数相加与大数相减

    千次阅读 2015-08-21 20:02:49
    大数相加 大数相减
  • C语言中的大数相加问题一.为什么会出现大数相加的问题二.大数相加所要掌握的知识三.大数相加的思路四.整理代码五.运行实例 一.为什么会出现大数相加的问题 **C语言是面向过程的一门语言,它并不像java一般拥有众多...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 198
精华内容 79
关键字:

大数相加c语言

c语言 订阅