C语言高精度加法

前言

发现博客可以用来记录自己的学习过程,真不错。

第一次遇到需要高精度计算的题目,一开始傻乎乎的直接计算发现不得行,原来还能这样。


主要思路:

字符数组可以连续输入但又不是整型数字而是字符,而整型数组可以输入数字但又不能连续输入,所以两者结合一下就可以解决。


代码如下:

1.先将大数字通过字符数组存入。

#include <stdio.h>
int main()
{
 char num1[200]={0},num2[200]={0};
 int a[200]={0},b[200]={0},num[200]={0},j=0,k=0,l1=0,l2=0,l,i=0,m,n;
 
 scanf("%s",num1);	//num1和num2用来存大型数组
 scanf("%s",num2);   

2.计算出字符串长度方便后面使用

while(num1[l1]!='\0') l1++;
while(num2[l2]!='\0') l2++;	//计算长度

if(l1>l2) l=l1;
else l=l2;			//找出哪个数字更大,方便后面及时停止循环
for(m=0,j=199;l1!=m;j--,m++)
	a[j]=num1[l1-m-1]-'0';	   //将字符数组中的数字赋值到数字数组中
for(n=0,k=199;l2!=n;k--,n++) 	   //a,b为存储大型数字的整型数组
	b[k]=num2[l2-n-1]-'0';     //从数组的最后一位开始复制到整型数组的最后一位

3.重点就是计算,加法的计算还是简单点的,主要方法是个位为两个数各位相加再求余,然后/10进位到百位,依次类推。

int t = 0;
for(;i<l+1;i++)             	  	   //l+1为更大的数长度加一,因为最大也只是往前加个一
  {
    num[199-i]=(a[199-i]+b[199-i]+t)%10;   //t为小位进位过来的数
    t=(a[199-i]+b[199-i]+t)/10		   
  }

4.计算已经做好,只需要再把数组前面的0全部去除输出就行

 i=0;
 for(;i<200;i++)
 {
  if(num[i]!=0)
  break;                  //从左往右依次输出,遇到0跳过,第一次遇到非0跳出循环
 }
 
 for(;i<200;i++)
 printf("%d",num[i]);

完整代码

#include <stdio.h>
int main()
{
 char num1[200]={0},num2[200]={0};
 int a[200]={0},b[200]={0},num[200]={0},j=0,k=0,l1=0,l2=0,l,i=0,m,n;
 
	scanf("%s",num1);
	scanf("%s",num2);     

	while(num1[l1]!='\0') l1++;
	while(num2[l2]!='\0') l2++;     

	if(l1>l2) l=l1;
	else l=l2;            
	
	for(m=0,j=199;l1!=m;j--,m++) 
	a[j]=num1[l1-m-1]-'0';
	for(k=199,n=0;l2!=n;k--,n++) 
	b[k]=num2[l2-n-1]-'0';    
	
	int t = 0;
	for(;i<l+1;i++)
	{
		num[199-i]=(a[199-i]+b[199-i]+t)%10;
		t=(a[199-i]+b[199-i]+t)/10;
	}
	
	i=0;
	for(;i<200;i++)
	{
		if(num[i]!=0)
		break;        
	}
	
	for(;i<200;i++)
	printf("%d",num[i]);

}

总结

发现小位进位只能进1,好像还能更简单点,以后优化一下,高精度乘法好像更难点。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值