本文中的代码都在Visual Studio(版本为2022)软件中运行,在使用scanf函数记得在第一行写下面的代码:
#define _CRT_SECURE_NO_WARNINGS
整数高精度加法(加数都为高精度)
#include <stdio.h>
#include <string.h>
//在C语言中,数组名在大多数表达式中(特别是作为函数参数时)
// 会被解释为指向数组第一个元素的指针。
// 这意味着,尽管形参在函数声明和定义中被声明为某类型的数组,
// 但在函数内部,它实际上被当作指向某类型的指针来处理。
//
//strToint(s1, arr1)
// int strToint(char src[], int des[])
// s1 和 arr1分别传给了char src[] ,int des[],
// 此时char src[]表示的是以数组名s1为首元素的数组,即s1数组
// 此时int des[]表示的是以数组名arr1为首元素的数组,即arr1数组
int reverseStrToInt(char src[], int des[]) //形参为字符数组,整形数组
{
int length = (int)strlen(src); //获得字符数组的有效长度
for (int i = 0; i < length; i++) //将字符数组中的元素以倒序的方式存放在整形数组中
{
des[length - i - 1] = src[i] - '0'; //des数组中存放的是数值
} //字符数字在进行加减操作时,是以其ASCII码值计算
return length; //字符0的ASCII码值为48, 字符1的ASCII码值为49,以
//此类推。
//返回字符数组也就是整形数组的有效长度,方便后续
//遍历整形数组
}
int main()
{
char s1[101] = ""; //创建两个字符数组,可以存储数值为100位的数字,长度为101的原因是需要为
//字符串结尾的标志"\0"提供一个位置,
char s2[101] = "";
int arr1[101] = { 0 }; //存放字符数组s1反转后的内容,此时,一个int类型表示一个0到10之间
//的数(不包括10)
int arr2[101] = { 0 }; //存放字符数组s2反转后的内容,此时,一个int类型表示一个0到10之间
//的数(不包括10)
int arr3[101] = { 0 }; //存放整形数组arr1和arr2对应位置元素进行想加后的值
scanf("%s\n%s", s1, s2); //初始化三个整形数组,元素值均为0
//把字符数组表示的数值转换为以整形数组表示的数值并将其反转
int length1 = reverseStrToInt(s1, arr1); //实参为字符数组首元素的地址
int length2 = reverseStrToInt(s2, arr2); //实参为整形数组首元素的地址
int maxLength = length1 > length2 ? length1 + 1: length2 + 1; //两个相同数相加,得到的
//最大数值位为较大数值位加1
for (int i = 0; i < maxLength; i++) //将两个整形数组中对应位置上的元素进行相加,
//并放在表示和的数组中
{
arr3[i] = arr1[i] + arr2[i] + arr3[i];
arr3[i + 1] = arr3[i] / 10;
arr3[i] %= 10;
}
while (arr3[maxLength - 1] == 0 && maxLength >1) //防止输出结果时,数值前面有0。
{ //同时,确保了当两个数都为0时,输出