求大牛纠错c语言程序(有关高精度加减法)

Description
Calculate A-B

Input
Two integer a and b(-10^100 < a,b < 10^100)

Output
Output a-b

Sample Input

1 2

Sample Output

-1

我的程序
#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;/*n用来判断是正是负*/

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
c[k]=a[k];
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
c[k]=b[k];
i--;
}
n=n*(-1);
}
}
else
{ /*a负b正,a正b负其实是做加法*/
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;
}
不好意思……因为心情烦躁实在是写不出过多的注释了……将就一下吧……求大牛看看……实在看不下去就给我一个正确的也行……能让我懂了我就给分……谢谢谢谢谢谢~
分数 好说……至于究竟是因为分数太低还是自己没水平所以没有正面回答而是自作聪明的讲些基本原理……我就不说了……上面这个程序我自己已经改进过了一些……可惜还是没有通过……愿意帮忙的大牛联系我……

/*********************
程序功能:计算任意位两整数相减
这里我为了程序的可管理性(也就是可维护性)
用了把程序分成了好几块,
当然对我来说这并不算多。这样的程序
更符合软件工程的要求或说对做比较大的程序较好
虽然这么多还是不够的,但是怕多了你会觉得太过复杂
请耐心读完,或直接上机器看结果。
当然对于有小数的也可以写,但是那样代码多得多。
******************/
#define LEN 250
#include <stdio.h>
#include <string.h>
/*A、B异号*/
int subA(char cha[], char chb[], char chc[])
{
int j = 0;
int tem = 0;
int flag = 0;
int a;
int b;
int fa = 0;
int fb = 0;
int lena = strlen(cha) - 1;
int lenb = strlen(chb) - 1;
char ch;
printf("not the same\n");
if ('-' == cha[0])
{
ch = '-';
fb = -1;
}
else
{
fa = -1;
ch = '+';
}
for (; lena > fa && lenb > fb; lena--, lenb--)
{
tem = (cha[lena] - '0') + (chb[lenb] - '0') + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
j++;
}
if (lena > fa)
{
for (; lena > fa; lena--, j++)
{
tem = cha[lena] - '0' + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
else if (lenb > fb)
{
for (; lenb > fb; lenb--, j++)
{
tem = chb[lenb] - '0' + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
if (flag)
{
chc[j] = flag + '0';
j++;
}
chc[j] = ch;
j++;
return j;
}

/*比较函数*/
/****写这函数是因为发现用系统比较strcmp()出问题,具体在哪我也没去查
我当然也知道系统的会返回一些正负或0值,但是我这里测有时候对有时候错****/
int AcmpB(char cha[], char chb[])
{
int i;
int j;
int lena;
int lenb;
lena = strlen(cha);
lenb = strlen(chb);
if (lena > lenb)
{
return 1;
}
else if (lena < lenb)
{
return -1;
}
else
{
for (i = 0; i < lena; i++)
{
if (cha[i] < chb[i])
{
return -1;
}
else if (cha[i] > chb[i])
{
return 1;
}
}
}
}

/*A、B同号*/
int subB(char cha[], char chb[], char chc[])
{
int i;
int j = 0;
int f;
int tem;
int tema;
int temb;
int lena;
int lenb;
int count = 0;
int temflag;
char ch;
char chtem[LEN];
if ('-' == cha[0])
{
ch = '-';
f = 0;
}
else
{
f = -1;
ch = '+';
}
temflag = AcmpB(cha, chb);
/*调整长度*/
if (temflag < 0)
{
strcpy(chtem, cha);
strcpy(cha, chb);
strcpy(chb, chtem);
/*判断正负*/
if ('-' == ch)
{
f = 0;
ch = '+';
}
else
{
f = -1;
ch = '-';
}
}
lena = strlen(cha) - 1;
lenb = strlen(chb) - 1;
for (; lenb > f; lenb--, lena--)
{
tema = cha[lena];
temb = chb[lenb];
if (tema < temb)
{
for (i = lena - 1; i > f; i--)
{
if ('0' != cha[i])
{
cha[i] = ((cha[i] - '0') - 1) + '0';
break;
}
else
{
count++;
}
}
if (count)
{
for (i++; i <= lena - 1 && count > 0; i++, count--)
{
cha[i] = '9';
}
}

tema += 10;
}
tem = tema - temb;
chc[j] = tem + '0';
j++;
}
/**退出循环有可能A还有数据**/
for (;lena > f; lena--)
{
chc[j] = cha[lena];
j++;
}
chc[j] = ch;
j++;
chc[j] = '\0';
return j;
}

/*判断输入的是否为合法数据,为程序健壮性设计,可不要。
但要保证你输入的是合法的,这是我规定的,合法返回1否则返回0
注意:这里判断的标准为正数不带符号,负数带减号且正数不能以0打头
负数也不能写成如-0123,而是写成-123否则将造成后面的大改AcmpB比较出错*/
int isringht(char ch[])
{
int i;
int len = strlen(ch);
/***这个if是防止输入如-0123类似数据****/
if ('-' == ch[0] && '0' == ch[1])
{
return 0;
}
if ('-' == ch[0] || '0' < ch[0] && ch[0] <= '9')
{
for (i = 1; i < len; i++)
{
if (ch[i] > '9' || ch[i] < '0')
{
return 0;
}
}
if (len == i)
{
return 1;
}
}
else
{
return 0;
}
}
/*输入函数这里规定如果输入不合法(含有非数字,除了符号位)
时,重输入,直到正确,当然还可以设别的出口,如果再加别的可能这程序会过大*/
void input(char ch[])
{
int flag = 1;
while (flag)
{
printf("Input the numbers:\n");
gets(ch);
if (!isringht(ch))
{
printf("Input error !\nplease re_input:\n");
}
else
{
flag = 0;
}
}
}
/*输出结果*/
void print(char ch[], int n)
{
int i;
int count = 0;
int flag = 1;
/*如果结果为零则直接输出一个0,而不是输出一串0*/
for (i = 0; i < n - 1; i++)
{
if ('0' != ch[i])
{
break;
}
}
if (i == n - 1)
{
printf("0");
return;
}
/****修正输出,比如当有-0003时只输出-3,正数也类似*****/
for (i = n - 2 - count; i >= 0; i--)
{
if ('0' == ch[i] && 1 == flag)
{
count++;
}
else
{
flag = 0;
break;
}
}
if ('+' == ch[n-1])
{
for (i = n - 2 - count; i >=0; i--)
printf("%c", ch[i]);
}
else
{
for (i = n - 1; i >= 0; i--)
{
printf("%c", ch[i]);
}
}
}

void main()
{
int i;
int len;
char ch;
char cha[LEN];
char chb[LEN];
char chresult[LEN + 1];/*结果可能有进位,如负数减正数*/

for (i = 0; i < LEN; i++) /*初始化存放结果的数组,以保证结果的正确性*/
{
chresult[i] = '0';
}
chresult[i] = '\0';/*字符串结束标志,本这不用多说*/

input(cha);
printf("the first number is: ");
puts(cha);
input(chb);
printf("the second number is: ");
puts(chb);
if ('-' == cha[0] && '-' != chb[0]|| '-' != cha[0] && '-' == chb[0])
{
ch = 'A';/*A、B异号*/
}
else
{
ch = 'B';/*A、B同号*/
}
switch(ch)
{
case 'A':
{
len = subA(cha, chb, chresult);
break;
}
case 'B':
{
len = subB(cha, chb, chresult);
break;
}
/* default:printf("*********"); */
}

printf("(first number sub second number)result is :\n");
print(chresult, len);
/*puts(chresult);
让程序到此停顿*/
getch();
}/***由于时间有限没有进行那么全面的测试,如果发现有什么漏处请给出指示
这样的代码你认为没有水平我也没办法了.等以后有提高再再次改进吧,现在能缩的只能这样了,不过一定能再缩的,不过那样会费更多的心思,要想出更好的算法**/
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-12-05
你的程序时实现什么功能?连功能都不知道怎么改啊
第2个回答  2009-12-05
日 我还没有学到这呢!!!
第3个回答  2009-12-03
为什么用a,b,c要用char型?直接用int不就行了,也不用分正负了。 题目里都说了是两个 INT 型的A,B
相似回答