| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1522 人关注过本帖
标题:求助大神 关于长整数的加法问题 编译通过 运行终止 应该是内存或数据溢出问 ...
只看楼主 加入收藏
吉吉455
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-7-3
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
求助大神 关于长整数的加法问题 编译通过 运行终止 应该是内存或数据溢出问题 但不知道哪里出错
完整代码:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 250
typedef struct{
    int elem[Stack_Size];
    int top;
}SeqStack; //建栈
typedef struct Node{
    int data;
    struct Node *next;
}Node,*BigInteger; //链表
void InitList(BigInteger L)
{
    L=(BigInteger)malloc(sizeof(Node));
    L->next=NULL;
}//初始化链表
void InitStack(SeqStack *S)
{
    S->top=-1;
}    //栈初始化
int IsEmpty(SeqStack *S)
{
    return(S->top==-1? TRUE:FALSE);
} //判栈空
int IsFull(SeqStack *S)
{
    return(S->top == Stack_Size-1? TRUE:FALSE);
}   //判栈满
int Push(SeqStack *S,int x)
{
    if(S->top == Stack_Size-1)return(FALSE);//栈已满
    S->top++;
    S->elem[S->top]=x;
    return(TRUE);
} //入栈
int Pop(SeqStack *S,int *x)
{
    if(S->top==-1)
    return(FALSE);
    else
    {
        *x=S->elem[S->top];
        S->top--;
        return(TRUE);
    }
} //出栈
BigInteger CreateBigInteger(char *str)
{/*函数功能:把由数字组成的字符串str转化为单链表,从字符串右边开始每4位,创建一个结点,直到字符串的最左边。*/
BigInteger L,p,q;
    int n,i,x,a,b;
n=strlen(str);//统计字符串str的长度n;
 InitList(L);
L->data=0;
i=n-1;
     while(i>=0)
     {
      for(x=0,a=4,b=1;a&&(i>=0);i--,a--,b*=10)   x=b*(str[i]-'0')+x;
      p=(Node*)malloc(sizeof(Node));
      q=(Node*)malloc(sizeof(Node));
      p->data=x;
q->data = x;
q->next = p;
q = p;
q->next = NULL;
}
L->next = q;
return L ;
}
BigInteger AddBigIntege (BigInteger L1,BigInteger L2)
{/*创建一个单链表用于存放L1+L2,并将该单链表作为函数值返回*/
    Node *L,*p,*q1,*q2;
     InitList(L);
     InitList(p);
     InitList(q1);
     InitList(q2);
    int x,carry;/*carry为进位*/
    L->next=NULL;L->data=0;
    q1=L1->next;
    q2=L2->next;
    carry=0;
while(q1&&q2){ /*两者均未到尾部*/
      x=q1->data+q2->data+carry;   
        if(x>10000)
        {carry=1;p->data=x-10000;}
        else
        {carry=0;p->data=x;}
        L->next=p;
        p=p->next;
        q1=q1->next;
        q2=q2->next;
    }
while(q1)
{
    x=q1->data+carry;
        if(x>10000)
        {carry=1;p->data=x-10000;}
        else
        {carry=0;p->data=x;}
        L->next=p;
        p=p->next;
        q1=q1->next;
}
while(q2)
{
    x=q2->data+carry;
        if(x>10000)
        {carry=1;p->data=x-10000;}
        else
        {carry=0;p->data=x;}
        L->next=p;
        p=p->next;
        q2=q2->next;
}
if (carry){
    p->data=carry;
    L->next=p;
    p=p->next;
    }
return L;   
}
int PrintBigInteger (BigInteger L)
{
    int x;
    SeqStack *S;
    InitStack(S);
    while(L)
    {
        L=L->next;
    Push(S,L->data);
    }
    while(S)
    {
    Pop(S,&x);
    if(x<1000)
    printf("0d%,",x);
else if(x==0)
    printf("0000,",x);
else if(x>1000)   
    printf("d%,",x);
    }
}
 int main()
 {
     BigInteger L1,L2;
     InitList(L1);
     InitList(L2);
     char ch[250],cj[250];
     scanf("%s",&ch);
     scanf("%s",&cj);
     L1=CreateBigInteger(ch);
     L2=CreateBigInteger(cj);
     //PrintBigInteger(AddBigIntege(L1,L2));
     return 0;
 }
help me!!!
搜索更多相关主题的帖子: 下载次数 include 
2016-07-03 19:52
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
看不出这个是整数加法,只是正整数加法吗?
2016-07-03 21:58
吉吉455
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-7-3
收藏
得分:0 
回复 2楼 吹水佬
大整数的加法
2016-07-03 22:26
吉吉455
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-7-3
收藏
得分:0 
回复 2楼 吹水佬
是正整数的加法
2016-07-03 22:29
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:0 
。。。。。。
这么复杂的大数加法??
又是栈操作,又是字符转换。。。
楼主直接用f9,然后单步调试好了。。

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2016-07-04 03:26
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用吉吉455在2016-7-3 22:29:15的发言:

是正整数的加法

或者换另一种思路,如:
“456” + “9789”
1、分配4*sizeof(int)空间存放各位对应的“和”运算结果:9,11,13,15
2、从右到左处理各位满10进1,当前位=当前位%10,前一位+=当前位/10,结果:10,2,4,5
3、将各位int转换为string并连接得出结果:10245
跟进:
1、容错处理:数字串各位的有效性('0'--'9')和数字串长度限制。
2、有符号整数加法:
    1)同号相加。算法同上面,结果取符号。
    2)异号相加。不同点:
        (1)数字串等长直接比较大小,不等长取较长者为大,分配 较大者长度*sizeof(int)空间,结果符号取较大者符号。
        (2)各位对应用“减法”运算。
        (3)从右到左处理各位<0借10,当前位+=10,前一位-=1。
3、乘法处理类同。
2016-07-04 06:42
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
CSDN论坛里的一个问题......
2016-07-04 08:37
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
void InitList(BigInteger L)
void InitStack(SeqStack *S)

这两个函数想好怎么用。

scanf和printf用法也有问题。


[fly]存在即是合理[/fly]
2016-07-04 09:19
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
事实上初始化函数,只传一级指针本来就容易有问题,形参、实参傻傻分不清楚。


[fly]存在即是合理[/fly]
2016-07-04 09:21
吉吉455
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-7-3
收藏
得分:0 
回复 9楼 azzbcc
这个问题已解决,现在是运行结果不对
2016-07-04 13:39
快速回复:求助大神 关于长整数的加法问题 编译通过 运行终止 应该是内存或数据溢 ...
数据加载中...
 
   



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

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