高精度加法及相关代码(C语言)

高精度加法及相关代码(C语言)

以下包括:

  1. C语言整型取值范围
  2. 利用ASCII码值来进行字符和数字的转换
  3. 高精度相加问题

一.C语言整型取值范围介绍

1.如何计算每个类型存储的数值范围

例如int而言:
int占有4个字节,而每个字节是8位,所以int类型占据的数值范围为:4*8=32;
而第一个字节位是正负字节,
所以int能够存储的数值范围为-231~231-1。
(对于大多数编译器来说,int都是占4个字节,也有占2个字节的情况)

而对于整型来说最大的long long 也只是8个字节

类型存储空间大小最小值最大值
int4个字节-2 147 483 6482 147 483 647
long long8个字节-9 223 372 036 854 775 8089 223 372 036 854 775 807

而当超过long long数值类型大小的数,我们就得考虑其他的办法来做大数的计算了。

2.标准整数类型常见存储空间大小和取值范围

类型存储空间大小最小值最大值
unsigned char1个字节0255
signed char1个字节-128127
int4个字节-2 147 483 6482 147 483 647
unsigned int4个字节04 294 967 295
short2个字节-32 76832 767
unsigned short2个字节065 535
long4个字节-2 147 483 6482 147 483 647
unsigned long4个字节04 294 967 295
long long8个字节-9 223 372 036 854 775 8089 223 372 036 854 775 807
Unsigned long long8个字节018 446 744 073 709 551 615

二.高精度加法(大数相加)

1.设计算法时候需要考虑的问题

(1)如何输入

构造两个字符串数组,
可以用gets()的输入方法输入字符串,然后利用strlen函数来求出每一个字符串的长度

(2)如何实现加法

在构造一个整型数组,然后利用两个字符串倒序相加的办法来实现加法,同时在进行加法运算的时候应当考虑到:
位数的问题:
如果加数的位数不一样,就个位对齐,高位补0 ;
进位的问题:
数组的0号元素存最高位和最低位都可以,但是使用0号元素存最高位的时候要注意两个求和的结果,这个结果的和是不能进位的,可以用1号元素存最高位,留出0号元素来进位;

2.大数相加

(1)题目

输入两个正整数a,b,输出a+b的值。

(2)输入与输出

输入:
两行,每行一个整数,每个整数不超过1000位。
输出:
一行,两个整数的和。

样例输入:
15464315464465465
482321654151
样例输出:
15464797786119616

(3)代码

输入字符串,利用ASCII值的特性变为整型

ASCII的特性为:
将0~9的字符数字转换为数值的时候可以通过-‘0’或者-48得到:
例如char a=2;
①int b=a-‘0’;
②int b=a-48;

将0~9的数值转化为字符数字也可以通过‘+0’或者+48得到:
int a=2;
①char b=a+‘0’;
②char b=a+48;

#include<stdio.h>
#include<string.h>
int strlen1,strlen2;
int m,n,k=0;
char a[1010];	//第一个字符串
char b[1010];	//第二个字符串
int sum[1010];	//两个相加的和
int main()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
		//初始化数组
 	gets(a);
 	gets(b);
 		//输入两个字符串
 	strlen1=strlen(a);
 	strlen2=strlen(b);
 		//得到两个字符串的长度
 	int carry=0;
 		//进位判断
 	while(strlen1&&strlen2)
 	{
 		n=a[--strlen1]-'0';
 		m=b[--strlen2]-'0';
 		sum[k++]=(n+m+carry)%10;
 		carry=(n+m+carry)/10;
	}
		//任意加完一个字符串后退出
	while(strlen1)
	{
		n=a[--strlen1]-'0';
		sum[k++]=(n+carry)%10;
		carry=(n+carry)/10;
	}
		//判断第一个字符串是否加完
	while(strlen2)
	{
		m=b[--strlen2]-'0';
		sum[k++]=(m+carry)%10;
		carry=(m+carry)/10;
	}
		//判断第二个字符串是否加完
	if(carry==1)
		sum[k++]=1;
		//最后判断是否还有进位情况
	for(int i=k-1;i>=0;i--)
		printf("%d",sum[i]);
		//输出和
	return 0;
}

注:在这里我采用的方法是0号位置存储最低位的方法

同理高精度乘法,除法,减法也是可以利用上面的过程来进行得到,只是需要将while里面的代码稍加修改一下就可以了

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值