高精度加法(C语言实现)

高精度,是学C语言漫长的路上必须要学的一类程序
>>>高精度模板( 加,减,乘低精高精,除低精高精(有余数),高精阶乘(200000以内) ) (C语言实现)(注释多多)<<<
>>>高精度加法(C语言实现)<<<
>>>高精度减法(C语言实现)<<<
>>>高精度乘法(高精乘低精)(C语言实现)<<<
>>>高精度乘法(高精乘高精)(C语言实现)<<<
>>>高精度除法(高精除低精)(C语言实现)<<<
那么,先来讲一下高精度加法吧!


源代码&注释

//小程序版
#include<stdio.h>
#include<string.h>
char s[10100],ss[10100];
int a[10100],b[10100];
int len;

void jia()     //自定义函数"jia"(名字low了一点(好像不是一点,但容易理解不是吗)) 
{
	int l1 = strlen(s);     //"strlen"是一个计算字符串长度的函数 
	int l2 = strlen(ss);    //将输入的两个字符串的长度赋值给l1,l2
	if (l1 > l2) 
		len = l1;      //将len赋值为l1,l2中大的那个 
	else 
		len = l2;
//		for (int i = 0 ; i <= len ; i++)  //清零(这里for循环和下面三句memset都为将字符串清零 ) 
//			a[i] = b[i] = c[i] = 0;
	memset(a,0,sizeof(a));    //清零too(只能清零,不能干别的) 
	memset(b,0,sizeof(b));    //这是清零函数(字符串) 
	                                       //两个for循环是将输入的两个字符串倒过来
	for (int i = l1 - 1 ; i >= 0 ; i--)    //再将字符串里的字符转换为数字赋值给a,b整型数组 
		a[l1 - i - 1] = s[i] - '0';        //但为什么大数要用字符串存呢?
	for (int i = l2 - 1 ; i >= 0 ; i--)    //因为大数太大,用任何整型变量都存不下 
		b[l2 - i - 1] = ss[i] - '0';       //为什么要把字符串倒过来赋值呢? 
	                                //因为大数与大数是一位一位运算的,还要涉及进位等 
	for (int i = 0 ; i < len ; i++)
	{
		a[i] = a[i] + b[i];    //运算 
		a[i+1]+= a[i] / 10;    //如有进位,在后一位上加上 
		a[i] = a[i] % 10;      //原来那一位减掉进位了的 
	}
	if (a[len] != 0) len++;    //如果有进位就多显示一位(这句话很重要) 

	while (a[len - 1] == 0 && len>1) len--;		//我叫它while去零法
		
	for (int i = len - 1 ;i >= 0 ;i--)  //输出结果 
		printf("%d",a[i]);
	printf("\n");
}                              //高精度加法你懂了吗?

int main()
{
	printf("高精度加法(By STY)\n\n");
	printf("退出请按“Ctrl+Z”(在键盘上),并按回车,谢谢使用!\n"); 
    printf("请输入两个数字:\n");
    printf("数字:(用空格隔开)\n");
	while (scanf("%s%s",s,ss)!=EOF)
	{
        printf("\n结果:\n"); 
		jia();     //引用高精度加法函数
        printf("\n\n");
        printf("高精度加法(By STY)\n\n"); 
        printf("退出请按“Ctrl+Z”(在键盘上),并按回车,谢谢使用!\n");
	    printf("请输入两个数字:\n");
	    printf("数字:(用空格隔开)\n");
	}
	return 0;
}

思路

这就是高精度加法的整段代码,
思路就是:因 int 变量最大只能存2147483647 ( 即 2 32 − 1 ) (即2^{32}-1) 2321)这么大的数,存不了更大的数了,
所以只能把一个大数一位一位存入数组中,并进行相应的运算,
当然还有进位等一系列麻烦的问题,使得高精度运算是个难题
这些在上面的"源代码&注释"中解决了这些问题,
希望大家在看了这篇文章后理解和会使用高精度加法的运算了


希望大家喜欢这篇文章!!!
如有问题请留言,谢谢!!!
>>>我的博客<<<

  • 158
    点赞
  • 429
    收藏
    觉得还不错? 一键收藏
  • 62
    评论
在计算机科学中,尤其是在线竞赛(OJ,Online Judge)中,处理高精度加法是一个常见的任务,因为通常涉及的大整数超出了标准数据类型(如int或long long)的范围。在C语言中,要实现高精度加法,一种常用的方法是使用数组或者动态内存分配来存储大整数,并逐位进行加法运算。 以下是一个简单的高精度加法算法的步骤: 1. 定义两个大整数数组,每个元素存储一位数字。 2. 初始化两个指针,分别指向这两个数组的末尾。 3. 当两个指针所指向的位数不相同时,将较小数组的剩余位补零。 4. 对应位置的数字进行加法(0-9,10可能需要进位),并更新结果数组。 5. 如果在某个步骤发生了进位,需要在前一个位置增加1。 6. 指针向前移动一位,直到其中一个指针达到数组末尾。 7. 如果还有剩余的进位,将它加到结果数组的最前面。 这是一个简化版的描述,实际的代码实现会涉及到更多的边界检查和错误处理。下面是一个简化的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DIGITS 10000 // 可以根据需要调整 char* addStrings(char* str1, char* str2) { int len1 = strlen(str1); int len2 = strlen(str2); int max_len = len1 > len2 ? len1 : len2; int carry = 0; char* result = (char*)malloc((max_len + 1) * sizeof(char)); result[max_len] = '\0'; for (int i = max_len - 1; i >= 0; --i) { int sum = carry + (str1[i] - '0') + (str2[i] - '0'); result[i] = sum % 10 + '0'; carry = sum / 10; } if (carry) { result = carry + '0'; } return result; } int main() { char* str1 = "123456789"; char* str2 = "987654321"; char* result = addStrings(str1, str2); printf("Result: %s\n", result); free(result); // 一定要记得释放动态内存 return 0; } ```
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值