永发信息网

谁能帮我纠错啊……

答案:2  悬赏:0  手机版
解决时间 2021-07-17 06:19

c语言高精度减法……输入a,b输出a-b a,b可能是正整数也可能是负整数

这是我的,最好是帮我指出错误,实在看不下去就给我个正确的或者跟我讲思路吧……能给我更多的刁钻的测试数据也可以……谢谢谢谢!~

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main()
{
char a[150],b[150],c[150]={'\0'};
int i,j,k,m,n;

scanf("%s %s",&a,&b);
i=strlen(a);
j=strlen(b);
m=1;n=-1;

if ((a[0]=='-'&&b[0]=='-')||(a[0]!='-'&&b[0]!='-'))
{
if (a[0]=='-'&&b[0]=='-')
{
a[0]='0';
b[0]='0';
n=n*(-1);
}
if (j>i) m=0;
if (i==j)
for(k=0;k<i;k++)
if (b[k]>a[k]) m=0;

if (m==1)
for (k=i-1;k>=0;k--)
{
if (j>0)
{
if (a[k]>=b[j-1]) c[k]=a[k]-b[j-1]+48;
else
{
c[k]=a[k]-b[j-1]+10+48;
a[k-1]--;
}
}
else
if (a[k]>='0')
c[k]=a[k];
else
{
a[k-1]--;
c[k]='9';
}
j--;
}
else
{
for (k=j-1;k>=0;k--)
{
if (i>0)
{
if (b[k]>=a[i-1]) c[k]=b[k]-a[i-1]+48;
else
{
c[k]=b[k]-a[i-1]+10+48;
b[k-1]--;
}
}
else
if (b[k]>='0')
c[k]=b[k];
else
{
c[k]='9';b[k-1]--;
}
i--;
}
n=n*(-1);
}
}
else
{
if(a[0]=='-'&&b[0]!='-') {n=n*(-1);k=i-1;a[0]='0';if (j>k) k=j;}
else {k=j-1;b[0]='0';if (i>k) k= i;}


while((i>0)||(j>0))
{
if (i<=0) c[k]=b[j-1]+c[k];
else if(j<=0) c[k]=a[i-1]+c[k];
else c[k]=c[k]+a[i-1]+b[j-1]-48;
if ((c[k]-48)>=10)
{
c[k-1]=c[k-1]+1;
c[k]=c[k]-10;
}
i--;k--;j--;
}
if (c[0]<'0'&&c[0]>=0) c[0]=c[0]+48;
}

if (n==1) printf("%c",'-');
k=0;
while (c[k]=='0') k++;
while (c[k]!='\0')
{
printf("%c",c[k]);
k++;
}
system("pause");
return 0;
}

最佳答案
本人参赛模板(含注释,含高精度加法减法运算,main函数有具体示例):

#include <iostream>
#include <string>
using namespace std;

#define HPSIZE 1024

//长度 //倒序存储
struct HP
{
int len;
int s[HPSIZE + 1];
};

//////////////////////////////////////
//输入,只能是正整数
//////////////////////////////////////
string base_input(string str)
{
char c;

c = getchar();
while(c != '\n')
{
str.push_back(c);
c = getchar();
}

return str;
}

/////////////////////////////////////////
//将一个字符串转换成大数存入a
// a 目标变量
// str 原始数据
/////////////////////////////////////////
HP change(string str)
{
HP a;
int i;

while(str[0] == '0' && str.size() != 1)
str.erase(0, 1);

a.len = (int)str.size();
for(i = 1; i <= a.len; ++i)
a.s[i] = str[a.len - i] - 48;
for (i = a.len + 1; i <= HPSIZE; ++i)
a.s[i] = 0;
return a;
}

/////////////////////////////////////////
//输出
/////////////////////////////////////////
void HPprint(const HP &y)
{
int i;

for(i = y.len; i >= 1; i--)
printf("%d", y.s[i]);
}

////////////////////////////////////////
//比较两数大小
//返回 a>b -> 返回值大于0
// a<b -> 返回值小于0
// a=b -> 返回0
////////////////////////////////////////
int HPcompare(const HP a, const HP b)
{
int len;

len = (a.len>b.len) ? a.len : b.len;
while(len > 0 && a.s[len] == b.s[len])
len--;

if(len==0) return 0;
else return a.s[len] - b.s[len];
}

/////////////////////////////////////
//高精度加法c=a+b
// a, b 加数
// c 和
/////////////////////////////////////
HP HPplus(const HP a, const HP b)
{
HP c;
int i, len;

for(i = 1; i <= HPSIZE; i++)
c.s[i] = 0;
len = (a.len>b.len) ? a.len : b.len;

for(i=1;i<=len;i++)
{
c.s[i] += a.s[i] + b.s[i];
if(c.s[i] >= 10)
{
c.s[i] -= 10;
c.s[i + 1]++;
}
}
if(c.s[len + 1] > 0)
len++;
c.len = len;
return c;
}

////////////////////////////////////
//高精度减法c=a-b
////////////////////////////////////
HP HPsub(const HP a, const HP b)
{
HP c;
int i, len;

for(i = 1; i <= HPSIZE; i++)
c.s[i] = 0;
len = (a.len>b.len) ? a.len : b.len;

for(i = 1; i <= len; i++)
{
c.s[i] += a.s[i] - b.s[i];
if(c.s[i] < 0) //借位
{
c.s[i] += 10;
c.s[i+1]--; //高位存于数组的后部
}
}
while(len > 1 && c.s[len] == 0)
len--;
c.len = len;
return c;
}
int main(void)
{
string str_a, str_b;
HP a, b;
str_a = "1000000"; //初始要运算的数字
str_b = "1000000";
a = change(str_a); //将一个字符串转换成大数存入a
b = change(str_b);
HPprint(HPsub(a, b)); //进行减法运算
return 0;
}
全部回答

没有得数为0的情况

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
1200左右买个数码相机,要品牌的
为什么人在生病的时候 总喜欢胡思乱想?
DNF山东一+12斯巴达斯诅咒多少钱
爱情总让人心痛吗
谁教我怎么P图
谁 可以教我网上赚钱之道
为什么电脑重装系统后都不能装杀毒软件?
梦幻诛仙像完美别的游戏那样坑钱吗?
胎儿的生殖器官
个人所得税代扣代缴系统V1.2
劳动人民投诉
英语,语法好进高奖赏,急!
激光打眼后,眼球变形能否恢复过来,怎么才能
求够游戏人生的CDKEY...
二次函数的图像不经过第三、四象限,写出几个
推荐资讯
为什么我的电脑无法设置时间?
摩托1600好还是诺基亚E71好
こんにちは美しい 怎么读??
QQ飞车里的音乐名
最近在玩DNF时,老是卡屏导致死机(过去一周
有关地下连续墙防水
qq华夏,我想合好装备,绑定的,运气是要的,
人去世的时候会看到什么?
谁给个真三国无双的启动文件!
关于偷价值2万左右的半成品铁闸门,判几年?
梦幻那些140级装备书从哪里来的?
关于劳动法!急、急、急!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?