整数高精度算法(c语言)

 本文中的代码都在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时,输出 
                                                     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值