高精度加法及相关代码(C语言)
以下包括:
- C语言整型取值范围
- 利用ASCII码值来进行字符和数字的转换
- 高精度相加问题
一.C语言整型取值范围介绍
1.如何计算每个类型存储的数值范围
例如int而言:
int占有4个字节,而每个字节是8位,所以int类型占据的数值范围为:4*8=32;
而第一个字节位是正负字节,
所以int能够存储的数值范围为-231~231-1。
(对于大多数编译器来说,int都是占4个字节,也有占2个字节的情况)
而对于整型来说最大的long long 也只是8个字节
类型 | 存储空间大小 | 最小值 | 最大值 |
---|---|---|---|
int | 4个字节 | -2 147 483 648 | 2 147 483 647 |
long long | 8个字节 | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
而当超过long long数值类型大小的数,我们就得考虑其他的办法来做大数的计算了。
2.标准整数类型常见存储空间大小和取值范围
类型 | 存储空间大小 | 最小值 | 最大值 |
---|---|---|---|
unsigned char | 1个字节 | 0 | 255 |
signed char | 1个字节 | -128 | 127 |
int | 4个字节 | -2 147 483 648 | 2 147 483 647 |
unsigned int | 4个字节 | 0 | 4 294 967 295 |
short | 2个字节 | -32 768 | 32 767 |
unsigned short | 2个字节 | 0 | 65 535 |
long | 4个字节 | -2 147 483 648 | 2 147 483 647 |
unsigned long | 4个字节 | 0 | 4 294 967 295 |
long long | 8个字节 | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
Unsigned long long | 8个字节 | 0 | 18 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里面的代码稍加修改一下就可以了