继大数相加的疑惑
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int t;
char* getnum(char*p)// 输入字符串
{
int i=0;
p=(char*)malloc(sizeof(char));//开辟一个区间先
while ((p[i++]=getchar())!='\n')//判断 并 输入p[i]
{
p=(char*)realloc(p,(i+1)*sizeof(char));//
}
p[i]='\0'; //把最后一项 变成'\0’ 这个我还是不懂
printf("验证i=%d\n",i);
return p;
}
int* bigadd(int*num,char*p1,char*p2)//相加
{
int n=0,i;
int ch1_n,ch2_n;
ch1_n=strlen(p1);//判断p1的长度 减去多分配的一个区间
ch2_n=strlen(p2);//判断p2的长度 减去最后那个多余无值区间
printf("ch2_n=%d\n",ch2_n);
printf("验证ch1_n=%d\n",ch1_n);
num=(int*)malloc(sizeof(int));
while (ch1_n>=0||ch2_n>=0)
{
--ch1_n; //其实这个判断可以省略
--ch2_n;
if (ch1_n>=0&&ch2_n>=0) num[n]=(p1[ch1_n]-'0')+(p2[ch2_n]-'0');//如果两个都还有数没有加
if (ch1_n<0&&ch2_n>=0)num[n]=p2[ch2_n]-'0';//如果p1已经取完数
if(ch1_n>=0&&ch2_n<0)num[n]=p1[ch1_n]-'0'; //p2取完数
num=(int*)realloc(num,(n+2)*sizeof(int));//只要两个不同时已经取完数 就要继续分配一个区间,那么最后有一个多余
n++;
}
for(i=0;i<n;i++)
printf("%d\n",num[i]);
t=n-1; //为什么是t=n-1 不是一共分配了n+1个区间吗?
printf("验证n=%d\nt=%d\n",n,t);
num[t]=0;//把最后那区域赋值给0 预防上一位也要进位
//先记下num一共多少位。
return num;
}
int* carry(int*num) //进位
{
for (int n=0;n<=t;) //从第一位开始到第t位 一直进位 帮我看看这个n<=t 有没有错
{
while (num[n]>=10)//当num的值大于10时候
{
num[n++]-=10;// num自减10;
num[n]+=1;// 下一位数+1;
continue;
}
n++;//判断下一位数
}
return num; //返回num指针
}
void printnum(int*num)//输出num的数组
{
t=(num[t]==0)?t-1:t;
while(t>0) //为什么不是t>=0 ?? num[0]q去哪了?
{printf("%d",num[t]);
t--;
}
}
main()
{
int *num;
char*p1,*p2;
p1=getnum(p1);
p2=getnum(p2);
num=bigadd(num,p1,p2);
printnum(carry(num));
}
这是论坛里一个友人发的!想必大家都看到过了!但是问题没解决!我想了好久了还是有点不明白的地方!就是我在输入验证num中的值时(就那个红色部分那块)、num[0]的值怎么会是负数啊???还有那些注释里的问题大家给看看哈!我被这题给搞的无语了!好几天了!一点进展都没有[ 本帖最后由 遮天云 于 2010-9-23 10:23 编辑 ]







~~~~~~~~