/************************************************************************/
/* 两个整型大数加减
题目: 求两个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码比较
需重新写一个数字字符串比较函数
*/