精华内容
下载资源
问答
  • 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语言实现大数相加

    //利用栈来实现大数相加
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
    	char s1[100];
    	char s2[100];
    	printf("请分别输入你的s1,s2\n");
    	gets(s1);
    	gets(s2);
    	char *s1_p;
    	char *s2_p;
    	int *s3_p;
    	int i,temp;
    	s1_p=(char *)malloc(sizeof(char)*strlen(s1));
    	s2_p=(char*)malloc(sizeof(char)*strlen(s2));
    	s3_p=(int*)malloc(sizeof(int)*(strlen(s2)+strlen(s1)));
    	int s1_p_;
    	int s2_p_;
    	int s3_p_;
    	s1_p_=s2_p_=s3_p_=-1;
    	for(i=0;i<strlen(s1);i++){
    		s1_p[++s1_p_]=s1[i];
    	}
    	for(i=0;i<strlen(s2);i++){
    		s2_p[++s2_p_]=s2[i];
    	}
    	temp=0;
    	while(s1_p_>-1&&s2_p_>-1){
    		s3_p[++s3_p_]=(s1_p[s1_p_]+s2_p[s2_p_]-2*'0'+temp)%10;
    		temp=(s1_p[s1_p_]+s2_p[s2_p_]+temp-2*'0')/10;
    		s1_p_--;
    		s2_p_--;
    	}
    	if(s1_p_==-1){
    		while(s2_p_>-1){
    		s3_p[++s3_p_]=(s2_p[s2_p_]-'0'+temp)%10;
    		temp=(s2_p[s2_p_]-'0'+temp)/10;
    		s2_p_--;
    	}
    	}
    	else if(s2_p_==-1){
    		while(s1_p_>-1){
    		s3_p[++s3_p_]=(s1_p[s1_p_]-'0'+temp)%10;
    		temp=(s1_p[s1_p_]-'0'+temp)/10;
    		s1_p_--;
    	}
    	}
    		s3_p[++s3_p_]=temp; 
    	while(s3_p_>-1){
    		printf("%d",s3_p[s3_p_--]);
    	}
    	printf("\n");
    	return 0;
    }
    
    展开全文
  • c语言实现大数相加

    2019-03-20 18:20:24
    两个大数我们可以用数组来保存,然后在数组中逐位进行相加,再判断该位相加后是否需要进位,为了方便计算,我们将数字的低位放在数组的前面,高位放在后面。 捕获.JPG #include<stdio.h> #include<...

    文章转自:https://www.6k8k.top/post/63.html
    两个大数我们可以用数组来保存,然后在数组中逐位进行相加,再判断该位相加后是否需要进位,为了方便计算,我们将数字的低位放在数组的前面,高位放在后面。

    捕获.JPG

    #include<stdio.h>
    #include<string.h>
    
    int main(){
    	char n1[10000]={'0'},n2[10000]={'0'};
    	int result[10001]={0},t1[10000]={0},t2[10000]={0};
    	int len,len1,len2;
    	int i,j;
    	printf("请输入第一个数:"); 
    	scanf("%s",&n1);
    	printf("请输入第二个数:");
    	scanf("%s",&n2);
    	printf("n1=%s\n",n1);
    	printf("n2=%s\n",n2);
    	len1=strlen(n1);
    	len2=strlen(n2);
    	printf("len1=%d len2=%d\n",len1,len2);
    	if(len1>len2){
    		len=len1;
    	}else{
    		len=len2;
    	}
    	for(i=0,j=len1-1;j>=0;i++,j--){  
    		t1[i]=n1[j]-'0';
    	}
    	for(i=0,j=len2-1;j>=0;i++,j--){
    		t2[i]=n2[j]-'0';
    	}
    	printf("t1=");
    	for(i=0,j=len-1;j>=0;i++,j--){
    		printf("%d",t1[i]);
    	}
    	printf("\nt2=");
    	for(i=0,j=len-1;j>=0;i++,j--){
    		printf("%d",t2[i]);
    	}
    	printf("\n");
    	for(i=0;i<len;i++){
    		result[i]+=t1[i]+t2[i];
    		if(result[i]>9){
    			result[i+1]++;
    			result[i]-=10;
    		}
    	}
    	if(result[len]>0){
    		len++;
    	}
    	printf("result=");
    	for(i=len-1;i>=0;i--){
    		printf("%d",result[i]);
    	}
    	printf("\n");
    	return 0;
    }
    

    关键部分方便理解记忆:

    if(len1>len2){
    		len=len1;
    	}else{
    		len=len2;                //len为两个数组中最长的字符串长度
    	}
    	for(i=0,j=len1-1;j>=0;i++,j--){        //将字符转为单个数字并且倒序存放在int类型数组中
    		t1[i]=n1[j]-'0';
    	}
    	for(i=0,j=len2-1;j>=0;i++,j--){        //将字符转为单个数字并且倒序存放在int类型数组中
    		t2[i]=n2[j]-'0';
    	}
    	for(i=0;i<len;i++){            
    		result[i]+=t1[i]+t2[i];    //相加计算,注意(+=)为了进位
    		if(result[i]>9){
    			result[i+1]++;       //进位
    			result[i]-=10;
    		}
    	}
    	if(result[len]>0){            //判断最大一位是否有进位
    		len++;
    	}
    	for(i=len-1;i>=0;i--){        //倒序将结果输出
    		printf("%d",result[i]);
    	}
    
    展开全文
  • 此篇便是针对C语言无法实现大数相加进行书写的(不喜勿喷),int ~long~longlong~unsigned long long 均有对应的数据长度上限,因此便有了大数相加的问题。** 二.大数相加所要掌握的知识 本代码涉及数组,及字符

    一.为什么会出现大数相加的问题

    1. C语言是面向过程的一门语言,它并不像java一般拥有众多方便的方法,因此大多数的代码都要依靠程序员本身进行实现。此篇便是针对C语言无法实现大数相加进行书写的(不喜勿喷),int longlonglong~unsigned long long 均有对应的数据长度上限,因此便有了大数相加的问题。

    二.大数相加所要掌握的知识

    本代码涉及数组,及字符串的一些基本函数,基本的c语言的一些语句。
    函数的定义方法(掌握或不掌握均可以)。

    三.大数相加的思路

    1. 使用字符串进行大数的储存。
    char str1[numb],str2[numb];
     scanf("%s%s",&str1,&str2);
    

    2.引入三个数组作为字符串转为数字的容器,和最终计算结果的容器(可适当的根据位数设定数组大小),并引入变量计算字符串的长度(即大数的位数)。

    int numb1[numb]={0},numb2[numb]={0},numb3[numb]={0};//numb即为定义的数组大小,并对其进行初始化
    int leg1,leg2,leg3;
     leg1=strlen(str1);//利用c中本身的函数计算字符串的长度
        leg2=strlen(str2);
    

    3.将字符串转为数字类型存入数组类型,此处需要明白利用ASCII码将字符转为数字的原因(此处不再解释)

      for(int i=leg1-1,j=0; i>=0;i--,j++) {
            numb1[j]=str1[i]-'0';
        }
        for(int i=leg2-1,j=0; i>=0;i--,j++) { //倒叙储存的原因是为了此后进行计算方便,进行更易的进位。
            numb2[j]=str2[i]-'0';
        }
    
    

    假如大数为123456789
    987654321
    储存的方式如图所示
    例图
    来自作者亲手所画
    4.便为最关键的进位问题,10进制数满10进一,因此在每一次进行对应数组位相加(引入临时变量temp)时便要考虑进位问题(此处我采用的是for循环),将相加的结果放入数组三。话不多说上代码。

    for(int i=0;i<max(leg1,leg2);i++){//判断需要进行加法的位数
            int temp;
            temp=numb1[i]+numb2[i];
            if(temp>=10){
                numb3[i]+=temp-10;
                numb3[i+1]++;
            }
            else{
                numb3[i]=temp;
            }
        }
    

    5.最后一步便是最终结果的输出,因为相加后的结果是倒叙,只需将结果倒叙输出就可实现,(但需考虑大数最高位的进位问题,小编运用了数组的性质(即在未赋值的地方位’\0’)进行判断),而后进行了输出

     for(leg3=0;numb3[leg3]!='\0';leg3++){
        }
        for(int i=leg3-1;i>=0;i--){
            printf("%d",numb3[i]);
        }    
        }
    

    四.整理代码

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #define numb 10000
    void main()
    {
        int max(int a, int b);
        int leg1, leg2, leg3;
        char str1[numb], str2[numb];
        int numb1[numb] = { 0 }, numb2[numb] = { 0 }, numb3[numb] = {0};
        scanf("%s%s", &str1, &str2);
        leg1 = strlen(str1);
        leg2 = strlen(str2);
        for (int i = leg1 - 1, j = 0; i >= 0; i--, j++) {
            numb1[j] = str1[i] - '0';
        }
        for (int i = leg2 - 1, j = 0; i >= 0; i--, j++) {
            numb2[j] = str2[i] - '0';
        }
        for (int i = 0; i < max(leg1, leg2); i++) {
            int temp;
            temp = numb1[i] + numb2[i];
            if (temp >= 10) {
                numb3[i] += temp - 10;
                numb3[i + 1]++;
            }
            else {
                numb3[i] = temp;
            }
        }
        for (leg3 = 0; numb3[leg3] != '\0'; leg3++) {
        }
        for (int i = leg3 - 1; i >= 0; i--) {
            printf("%d", numb3[i]);
        }
    }
    int max(int a, int b) {
        return a>b?a:b;
    }
    
    
    五.运行实例

    在这里插入图片描述
    第一次写博客,还请诸位多多关照。

    展开全文
  • C语言实现大数相加相减和相乘

    千次阅读 2015-12-20 16:42:27
    C语言 大数相加 大数相减 大数相乘

    首先是字符串翻转函数,大数相加、相减和相乘中都用到了这个函数

    /*
    ** 字符串翻转
    */
    void Reverse(char *str, int n)
    {
    	int i;
    
    	for (i = 0; i < n / 2; i++)
    	{
    		char tmp;
    		tmp = str[i];
    		str[i] = str[n-i-1];
    		str[n-i-1] = tmp;
    	}
    }

    1.大数相加

    /*
    ** 这里假设str1和str2表示的数为非负数
    */
    void BigNumAdd(char *str1, char *str2, char *result)
    {
    	if (str1 == NULL || str2 == NULL || result == NULL)
    	{
    		return;
    	}
    	int len1, len2;
    
    	len1 = strlen(str1);
    	len2 = strlen(str2);
    
    	Reverse(str1, len1);			// 将str1翻转
    	Reverse(str2, len2);			// 将str2翻转
    
    	int weight = 0;					// 表示进位
    	int sum = 0;
    	int index = 0;					// 表示result的下标,从0开始,相加结束后应翻转
    	int i, j;
    
    	i = 0;							// 表示str1的下标
    	j = 0;							// 表示str2的下标
    
    	while (i < len1 && j < len2)	// 两个数对应的每一位进行相加
    	{
    		sum = str1[i] - '0' + str2[j] - '0' + weight;
    		weight = sum / 10;			// 计算是否要进位
    		sum %= 10;			
    		result[index++] = sum + '0';
    		i++; 
    		j++;
    	}
    
    	while (i < len1)				// str2已经加完了,这时还要考虑str1和str2的最高位相加时是否有进位的情况
    	{
    		sum = str1[i] - '0' + weight;
    		weight = sum / 10;
    		sum %= 10;
    		result[index++] = sum + '0';
    		i++; 		
    	}
    
    	while (j < len2)				// str1已经加完了,这时还要考虑str1和str2的最高位相加时是否有进位的情况
    	{
    		sum = str2[j] - '0' + weight;
    		weight = sum / 10;
    		sum %= 10;
    		result[index++] = sum + '0';
    		j++; 		
    	}
    
    	if (weight > 0)					// str1和str2都已经加完了,这时还要考虑最后一步中是否产生了进位
    	{
    		result[index++] = weight + '0';		
    	}
    
    	result[index] = '\0';
    									
    	Reverse(result, index);			// 对result进行翻转,得到最终的结果
    }
    
    2.大数相减

    /*
    ** 这里假设str1和str2表示的数为非负数,并且str1表示的数大于等于str2的数
    */
    void BigNumMinus(char *str1, char *str2, char *result)
    {
    	if (str1 == NULL || str2 == NULL || result == NULL)
    	{
    		return;
    	}
    	int len1, len2;
    
    	len1 = strlen(str1);
    	len2 = strlen(str2);
    
    	Reverse(str1, len1);			// 将str1翻转
    	Reverse(str2, len2);			// 将str2翻转
    
    	int index = 0;					// 表示result的下标,从0开始,相减结束后应翻转
    	int i, j;
    
    	i = 0;							// 表示str1的下标
    	j = 0;							// 表示str2的下标
    
    	while (i < len1 && j < len2)	// 两个数对应的每一位进行相减
    	{
    		result[index] = (str1[i] - '0') - (str2[j] - '0');
    
    		if (result[index] < 0)		// 当str1对应的位小于str2对应的位,应借位
    		{
    			result[index] = result[index] + 10 + '0';
    			str1[i+1] = str1[i+1] - 1;
    		}
    		else
    		{
    			result[index] = result[index] + '0';
    		}
    		index++;
    		i++; 
    		j++;
    	}
    	
    	while (i < len1)				// str2已减完,但是可能存在借位的情况
    	{
    		result[index] = str1[i] - '0';
    
    		if (result[index] < 0)
    		{
    			result[index] = result[index] + 10 + '0';
    			str1[i+1] = str1[i+1] - 1;
    		}
    		else
    		{
    			result[index] = result[index] + '0';
    		}
    		index++;
    		i++; 		
    	}
    	
    	while (result[--index] == '0')	// 去掉result后面的'0' 如40000 - 39999时会存在一些多源的'0'字符
    		;
    
    	result[++index] = '\0';
    
    	Reverse(result, index);			// 对result进行翻转,得到最终的结果
    }

    3.大数相乘

    /*
    ** 这里假设str1和str2表示的数为非负数,并且str1表示的数大于等于str2的数
    */
    void BigNumMulti(char *str1, char *str2, char *result)
    {
    	if (str1 == NULL || str2 == NULL || result == NULL)
    	{
    		return;
    	}
    
    	if (strcmp(str1, "0") == 0 || strcmp(str2, "0") == 0)
    	{
    		strcpy(result, "0");
    		return;
    	}
    
    	int len1, len2;
    
    	len1 = strlen(str1);
    	len2 = strlen(str2);
    
    	Reverse(str1, len1);			// 将str1翻转
    	Reverse(str2, len2);			// 将str2翻转
    
    	memset(result, '0', N);
    
    	int i, j;
    
    	int multiFlag;					// 乘积进位
    	int addFlag;					// 加法进位
    
    	for (i = 0; i < len2; i++)		// str2的每一位
    	{
    		multiFlag = 0;
    		addFlag = 0;
    		for (j = 0; j < len1; j++) // str1的每一位
    		{			
    			int temp1 = (str2[i] - '0') * (str1[j] - '0') + multiFlag;
    			multiFlag = temp1 / 10;
    			temp1 = temp1 % 10;
    			int temp2 = (result[i+j] - '0') + temp1 + addFlag;
    			addFlag = temp2 / 10;
    			result[i+j] = temp2 % 10 + '0'; 
    		}
    		result[i + len1] += multiFlag + addFlag;
    	}
    
    	if (result[len1+len2-1] == '0')
    	{
    		result[len1+len2-1] = '\0';
    	}
    	else
    	{
    		result[len1+len2] = '\0';
    	}
    	
    	Reverse(result, strlen(result));	// 对result进行翻转,得到最终的结果
    }
    





    展开全文
  • 大数相加 思路: 1.先将字符串倒序并转换为数字 2.逐位相加,并存入一个数组e[i]中 3.将得到的结果进行进位处理 4.转换并把数组e[i]反转,循环输出结果 #include&lt;iostream&gt; #include&lt;stdio.h...
  • C语言大数相加

    千次阅读 2016-04-23 13:46:23
    算法思想:大数使用字符串存储,每一个单元存储操作数的每一位,之后执行位相加。基本思路:字符串反转、字符变数字、位运算、反序输出C语言代码:#include<stdio.h> #include<string.h> #define Max 101 void ...
  • c语言大数相加

    2014-05-04 11:35:19
    一个运用c语言写的大数相加程序,可以实现大数的四则运算,拥有详尽的代码注释,相信可以帮助很多同学。
  • C语言大数相加实现

    2020-05-02 23:32:57
    由于大数不可存入int数组中,所以将数字转为字符输入char数组中,将两个数组数字从个位开始,模拟正常数字加法,需要进位1时设置进位标志,两数相加大于10时进位,见具体代码。 #include <string.h> #include ...
  • C语言实现大数的封装

    2012-07-06 19:43:52
    C语言实现的大数的封装,在.h头文件中介绍了包含的所有函数,主要提供大数的数据类型(包含负数)和大数相加,大数相减,大数乘法。由我个人实现,如有什么建议欢迎指点
  • C语言大数相加实现方法分析

    万次阅读 多人点赞 2018-04-16 16:01:36
    下面是楼主实现字符串数字相加的分析过程:1.首先来个简单的,单个数字字符相加求和inline int addchar(char c1,char c2,char &amp;s){ int t=c1+c2; //0-9的ascii码是48-57 if(t&lt;106){/...
  • C语言实现大数相乘

    2019-03-21 09:59:49
    昨天心血来潮,想实现数组大数相乘,不写C已经有段时间了,因为改写python了,最后发现宝刀未老啊! 想法:按照两个数相乘的方法实现。把数拆分放到数组中,进行相乘或者相加。 #include <stdio.h> #...
  • #include<stdio.h> #include<string.h> int main() { char n1[10000]={'0'}; char n2[10000]={'0'}; int result[10001]={0}; //最终的结果值 int t1[10000]={0}; int t2[10000]={0};... //记录...
  • #include<stdio.h>#include<string.h>int main(){ char s1[100],s2[100]; int num1[31],num2[31],len1,len2,i,j; memset(num1,0,sizeof(num1)); memset(num2,0,sizeof(num2)); printf("p...
  • 大数相加 51nod1005传送门 基本思路是: 1、两个字符串把大数读进来 然后把每一位字符换成数字存到 x y 数组里面 2、拿 x y 数组从后往前 对应位相加 (注意进位) 相加的结果依次存到 c数组里 3、然后对c...
  • 最简单的C语言实现大数相乘

    千次阅读 2019-01-20 10:07:38
    前言 : 实现大数相乘比相加要难一点 , 但是仔细分析会发现很多共同之处  分析 :  1. 由数学归纳法会发现用一般的两数相乘方法计算 , 每计算一次都能够确定最终结果的一位数字 2. 比如说 : 456 * 123  下面我...
  • 因为大数超出了long long int的范围,我们可以用两个字符数组来存放大数,然后模拟人工运算(从最后一位开始,相加然后进位),下面给出代码 #include<stdio.h> #include<string.h> int main() { char ...
  • 用字符串模拟大数,只需注意进位,使用了栈。 代码: 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 ...
  • C语言-大数加法

    2018-04-16 12:07:53
    C语言 实现大数加法,在加法运算的时候假如有两个10000位数的两个数进行相加,那么用int long double型都装不下这么多位数,所以采用char数组来实现加法运算,解决精度的问题

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

c语言实现大数相加

c语言 订阅