标题:继大数相加的疑惑
只看楼主
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
回复 9楼 ppfly
呵呵!谢谢你!我现在不在宿舍!等我会宿舍如果没疑问了就结贴哈
2010-09-23 12:40
青衣修罗
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:22
专家分:129
注 册:2010-9-16
得分:40 
解释加在你注释后面了
程序代码:
#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-1]='\0';  //把最后一项 变成'\0’  这个我还是不懂//原来字符串最后是'\n',现在换成字符串结束标志'\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');//如果两个都还有数没有加
        else if (ch1_n<0&&ch2_n>=0)
           num[n]=p2[ch2_n]-'0';//如果p1已经取完数
        else if(ch1_n>=0&&ch2_n<0)
           num[n]=p1[ch1_n]-'0'; //p2取完数
        num=(int*)realloc(num,(++n+1)*sizeof(int));//只要两个不同时已经取完数 就要继续分配一个区间,那么最后有一个多余
        //n++; 
    }

    for(i=0;i<n-1;i++)
    printf("%d\n",num[i]);
    t=n-1;    //为什么是t=n-1   不是一共分配了n+1个区间吗?//最后多分配的那个没用的,
              //所以下标为n-1时正好对应第n
    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 有没有错 //这里没必要搞个双重循环
    //{
        int n=0;
        while (num[n]>=10&&n<=t)//当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去哪了?//就应该是t>=0的啊,你这样写当num[t]!=0时
                          //即原最高位有进位时会少输出一位的,可以找个数试试
        {printf("%d",num[t]);
          t--;
        }
}
int main()
{
    int *num;
    char*p1,*p2;
    p1=getnum(p1);
    p2=getnum(p2);
    num=bigadd(num,p1,p2);
    printnum(carry(num));
        free(num);
    system("pause");
    return 0;
}


[ 本帖最后由 青衣修罗 于 2010-9-23 12:52 编辑 ]

程序就是:任何有目的的、预想好的动作序列。
2010-09-23 12:49
青衣修罗
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:22
专家分:129
注 册:2010-9-16
得分:0 
p[i]='\0';//这一句已经越界,存在隐患的。因为你只是分配了i个字节,但是你现在要将第i+1个字节内容改为'\0',所以这是个bug,最后接受的回车符完全没用的所以最好是
p[i-1]='\0';//因为这样num[0]中也存的是有效数字了,楼主好好考虑下

程序就是:任何有目的的、预想好的动作序列。
2010-09-23 13:13
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
以下是引用青衣修罗在2010-9-23 13:13:00的发言:

p='\0';//这一句已经越界,存在隐患的。因为你只是分配了i个字节,但是你现在要将第i+1个字节内容改为'\0',所以这是个bug,最后接受的回车符完全没用的所以最好是
p1]='\0';//因为这样num[0]中也存的是有效数字了,楼主好好考虑下
这点道是注意到了!第i个空间开辟了但是没有用
2010-09-23 14:35
青衣修罗
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:22
专家分:129
注 册:2010-9-16
得分:0 
以下是引用遮天云在2010-9-23 14:35:28的发言:

这点道是注意到了!第i个空间开辟了但是没有用
问题给你解释了居然没给分啊楼主

程序就是:任何有目的的、预想好的动作序列。
2010-09-23 15:42
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
以下是引用青衣修罗在2010-9-23 15:42:41的发言:

问题给你解释了居然没给分啊楼主
呃!我的结贴率可是信得过的哈!%100
谢谢各位的详细指教
看我结贴
2010-09-23 16:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-321136-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026321 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved