两个整型大数相减

/************************************************************************/
/*	两个整型大数加减
题目: 求两个100位数以内的加法   不含100位。
分析:由于数据类型的溢出。所以不能使用基本的数据类型。应该使用字符串来
表示。
	两个最大99位相减,有正负之分
输入: 6,9 结果应为 -3
*/
/************************************************************************/

#include <stdio.h>
#include <string.h>
#define LEN_100	 100
char *nizhi(char *p) //字符数组的逆置 
{	
	int len=strlen(p); 
	for(int i=0;i<len/2;++i) //注意最后的一个NULL不要算
	{
		char ctemp=p[i];
		p[i]=p[len-i-1];
		p[len-i-1]=ctemp;
	}
	return p;
}
/*函数: bignumasub
输入:字符数组a,字符数组b
输出:字符数组sub 
返回:字符数组sub
分析: 两个大数相减,
 1.求出 max min.	确定结果是为 正数or负数 用 uflag=1 正数
 2.求出长度 控制 位减法的次数。
 3. max,min整型数组求取  字符数组到整型数组
 4. 位相减  lendbit	
	sub[i]
*/
//  >0 大于 <0 小于 ==0 相等
int numcmp(const char *a,const char *b)
{
	int lena=strlen(a);
	int lenb=strlen(b);
	if(lena>lenb)
		return 1;
	else 
	{
		if(lena<lenb)
			return -1;
		else
			return strcmp(a,b);
	}
}
char *bignumsub(const char *a,const char *b,char *sub)
{	
	char max[LEN_100]={0};
	char min[LEN_100]={0};
	int lena=strlen(a);
	int lenb=strlen(b);
	int uflag=0; //结果 正负 标志位 1为负
	//比较大小 字符数组变为 Int数组
	if(numcmp(a,b)>=0) //比较 大小 a>=b
	{
		for(int i=0;i<lena;i++) //字符串数组变为 int数组
			max[i]=a[lena-i-1]-'0';
		for(int i=0;i<lenb;i++)
			min[i]=b[lenb-i-1]-'0';
	}
	else  // b大
	{
		for(int i=0;i<lenb;i++) //字符串数组变为 int数组
			max[i]=b[lenb-i-1]-'0';
		for(int i=0;i<lena;i++)
			min[i]=a[lena-i-1]-'0';
		uflag=1; //负数标志
	}
	//位 相减
	int  lendbit=0; //借位 
	int i=0;
	for(;i<lena || i<lenb;i++)
	{
		sub[i]=max[i]-min[i]-lendbit+'0';
		if(sub[i]-'0'<0) //sub[i]>0
		{
			sub[i]+=10; 
			lendbit=1; //有借位
		}
		else 
		{	
			lendbit=0;	//无借位
		}
	}
	if(0==sub[i-1]-'0') //如果末尾 为int 0 
	{
		if(uflag)
			sub[i-1]='-'; //直接用-号 覆盖
		else sub[i-1]=0;
	}
	else
	{
		if(uflag)
			sub[i]='-';
	}
	return sub;
}
void main()
{	
	while(1)
	{	
		char a[LEN_100]={0};//初始化 最多99位 最多需要100位来存
		char b[LEN_100]={0}; //两个存储字符数组
		char sub[LEN_100]={0};
		printf("输入被减数a:\n");
		gets(a);
		printf("输入减数b:\n");
		gets(b);
		printf("差为:\n%s\n",nizhi(bignumsub(a,b,sub)));
	}
}

/* 错误:
	使用strcmp去比较两个数字字符串 其规则为从第一个不相等的字符按照ASCII码比较
	需重新写一个数字字符串比较函数
*/



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值