大数加法(100位数)

注意:

这只是100位数(十进制)以内的正整数的加法

目录

法一

法二

一、为什么不能简单的A+B 

二、大数加法的原理

篇尾


我终于在今天写出来了o(*≧▽≦)ツ┏━━┓

法一

#include <stdio.h>
#include<string.h>
int main(){
//定义变量、初始化 
	char a[101],b[101];
	int c[101]={0};
	for(int i=0;i<101;i++){a[i]='0';b[i]='0';}
//输入大数、判断长度  
	scanf("%s %s",a,b);
	int long_a=strlen(a);
	int long_b=strlen(b);
	int long_max=long_a>long_b?long_a:long_b;
	int long_min=long_a>long_b?long_b:long_a;
//倒过来 
	strrev(a);strrev(b);
	//printf("%s %s\n",a,b);
	for(int i=0;i<long_max;i++){
		c[i]+=((int)a[i]-48)+((int)b[i]-48);
		if(i==long_min)c[i]+=48;
	}
//定义输出数组(已完成两次颠倒),初始化 
	int output[long_max];
	for(int i=0;i<long_max;i++){
   		output[i]=0; 
	}
   	for(int i=0;i<long_max;i++){
   		output[long_max-i-1]=c[i];
	}
//进位问题
	for(int i=long_max-1;i>0;i--){
   		if(output[i]>=10){
			output[i-1]+=1;
   			output[i]=output[i]%10;
        }
	}
	printf("\n");
	for(int i=0;i<long_max;i++){
   		printf("%d",output[i]);
	}
    return 0;
}

写出来后发现

Σ(っ °Д °;)っ 

找了半天原因,发现是不能用 strrev( );

这个我也不太清楚,大概是我刷题的平台的 string.h 库里没有这个函数吧,

了解情况后,我决定通过循环实现 strrev() 函数的功能。

法二

#include <stdio.h>
#include<string.h>
int main(){
//定义变量、初始化 
	char x[101],y[101],a[101],b[101];
	int c[101]={0};
	for(int i=0;i<101;i++){x[i]='0';y[i]='0';a[i]='0';b[i]='0';}
//输入大数、判断长度  
	scanf("%s %s",x,y);
	int long_a=strlen(x);
	int long_b=strlen(y);
	int long_max=long_a>long_b?long_a:long_b;
	int long_min=long_a>long_b?long_b:long_a;
//倒过来 
	for(int i=0;i<=long_a;i++){
		a[i]=x[long_a-i-1];
	}
	for(int i=0;i<=long_b;i++){
		b[i]=y[long_b-i-1];
	}
//字符变整型 
	for(int i=0;i<long_max;i++){
		c[i]+=((int)a[i]-48)+((int)b[i]-48);
		if(i==long_min)c[i]+=48;
	}
//定义输出数组(已完成两次颠倒),初始化 
	int output[long_max];
	for(int i=0;i<long_max;i++){
   		output[i]=0; 
	}
   	for(int i=0;i<long_max;i++){
   		output[long_max-i-1]=c[i];
	}
//进位问题
	for(int i=long_max-1;i>0;i--){
   		if(output[i]>=10){
			output[i-1]+=1;
   			output[i]=output[i]%10;
        }
	}
//输出
	for(int i=0;i<long_max;i++){
   		printf("%d",output[i]);
	}
    return 0;
}

这道题困惑了我好几天,ac时真的非常激动,以后掌握的牢了会来简化代码

感觉有点水,好了,正文开始

一、为什么不能简单的A+B 

在C语言中,每个数据类型都是有表示范围的,这个我以后会写一篇细讲

目前,表示正整数范围最大的数据类型是 unsigned long long (int),

表示范围是 0~4294967295 即 0~( -1),

也就是说只用基本数据类型,十位数的运算就是到极限了,

这时,想要进行大数运算,就要另寻他法了。 

二、大数加法的原理

其实,就是我们小学学的列式法,一位一位的加,大于十就进位。 

篇尾

我也是初学者,知识限制,代码比较笨,网上大数加法代码多着是,我提供的只是一种的思路。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值