高精度计算运用数组进行大整数加减法

高精度计算运用数组进行大整数加减法

a) 涉及知识点:数组、流程控制等
b) 要求:用整型数组表示10进制大整数(超过2^32的整数),数组的每个元素存储大整数的一位数字,实现大整数的加减法。

#include<stdio.h>
#include<string.h>
int main()
{
	char s1[100],s2[100];//创建两个字符数组 
	int a[100]={0},b[100]={0},result1[101]={0},result2[101]={0};//这四个数组分别表示加数/被减数,加数/减数,加法结果,减法结果 
	int n1,n2,n,t;
	scanf("%s%s",&s1,&s2);//输入两个数 
	n1=strlen(s1);
	n2=strlen(s2);//分别确定两个数的位数 
	
	for(int i=n1-1, j=0; i>=0; i--, j++)
	{
		a[j] = s1[i] - '0';	
	} 
    for(int i=n2-1, j=0; i>=0; i--, j++)
	{
		b[j] =s2[i] - '0';	
	}
	//将两个字符数组倒序放在两个整型数组中	
	n=(n1 > n2 ? n1 : n2);	
	//确定最高位数 
	
	for( int i=0 ; i<n ; i++ )
	{
		result1[i]+=a[i]+b[i];
		if(result1[i]>9)
		{
			result1[i]-=10;//这是加法运算,如果两数相加超过10则进位 
			result1[i+1]++;
		}
	}
	
	for(int i=n-1;i>=0;i--)
	{
		printf("%d",result1[i]);
	}
	printf("\n");//输出加法运算结果 
	
	if(n1 > n2)
		t = 1;
	else if(n1 == n2)
		t = strcmp(s1, s2);
	else 
		t = -1;
	//上面这部分是比较两个数的大小 
	if(t==0)
		printf("0");//如果两数相等则直接输出0; 
	if(t<0)
		printf("-");//如果被减数小于减数,先输出负号,再进行倒置的减法运算 
	for(int i=0; i<n; i++)
	{
		if(t>=0)
		{
			if(a[i]>=b[i])
				result2[i] = a[i] - b[i];
			else 
			{
				result2[i] = a[i] + 10 - b[i];
				a[i+1]--;//这是借位 
			}
		}//以上为常规情况 ,下面是结果为负的情况 
		else 
		{
			if(a[i]<=b[i])
				result2[i] = b[i] - a[i];
			else
			{
				result2[i] = b[i] + 10 - a[i];
				b[i+1]--;
			}
		}
	}
	
	for(int i=n-1,notzero=0; i>=0; i--)
	{
		if(result2[i]!=0)
			notzero=1;//把结果前的0都处理掉,不输出,直到遇到第一个非零数再输出 
		if(notzero)
			printf("%d",result2[i]);
	}
	//减法运算结果输出 
	return 0;
}

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
落叶高精度表达式计算器V1.0(32位)版 本计算器程序是在win7 32位系统上,使用VB6.0开发的,本程序的主要特点是: 1) 高精度,支持万位精度的有理数常用运算; 包括:加,减,乘,除,乘方,开N次方,三角函数,反三角函数,双曲三角函数,反双曲三角函数等。 2) 表达式运算,本程序没有采用常用计算器的边输入边计算,而是输入完所有数据或算式后,解析表达式,分解运算符和数据,最后在运算出结果。 点击程序界面上的等于按钮,计算器开始运算。 3) 本计算器的各种运算函数大都是自已所写,没有调用大数库或其它数学库,仅大数开平方调用GMP大数库。 本计算器的各种子函数是通过定义的一个高精度数据结构接收和返回运算结果,这个高精度数据结构可以定义有符号(整数,小数,科学计数法表示的数), 函数内部集中对数值,小数点位置,指数进行运算,优点是调用简单,不易出错,可以说比较完善,综合运算能力强。 这点和大数库的实现不同, 大数库大都只提供对整数的运算,假如要对有理数运算, 一:你需要很多的调用前和调用后处理工作,这些工作并不需要很高的知识,但却需要很长时间的调试,它并不会因为你的水平很高而获得很大的时间提升。 二:很难进行综合运算。当你把某一个函数调顺后,进行综合运算时,会出现很多新的问题。 高精度数据结构VB定义为: Type StrToZx '高精度数的结构头 ZhFhBz As Boolean '正负号标志 XsdWz As Long '小数点右边数字的长度。例1234.567中这个数是3(为什么要这样定义,因为大多的基本运算都是右对齐的,这样定义减少了中间一些不必要的转换) JzBz As Integer '标记数组存的是什么进制的数(十进制或其它进制数) strlen As Long '运算数长度 Zx() As Long '存放运算数的数组 eE As Long '存放指数 End Type 4)综合运算,里面的三角函数,用户界面的算式,表达式运算,都是综合运算的体现,综合运算是大量基础运算的集合,中间稍有差错,就会算不出正确答案,里面内容繁琐,这里简单介绍一下。 5)本程序从2015年11月开始试编写,至2016年8月大致完成,开发周期很长,中间代码写了一两万行,从零基础到运行效率,综合效率的初中等水平,主要目的是练习编程,老外的数学软件已很强大,是我不可能相比的,我觉得我的程序如果把程序源码作为大数实例初级学习更合适。 6)程序中函数都具有输入值较验功能,若输入错误,会弹出提示窗口提示那一个函数输入错误。 7)由于本人是初次编程练习,且自身知识的不足,加上精力有限,最后的测试收尾也只是简单测试,里面肯定存在很大的不足和没发现的BUG,请网友们在论坛,或 我的邮箱:[email protected], 微博:qq_34030789,中指正,交流。 我若纠错后,会在下载网站更新,并根据您的地址发一份给您,谢谢! 再次欢迎大家使用本计算器,本计算器具有很好的表达式解析功能,会在以后的使用中获得很好的用户体验!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值