| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 408 人关注过本帖
标题:大整数加法求改错(进位时输出少了最高位。。。)
只看楼主 加入收藏
砍砍
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-11-5
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
大整数加法求改错(进位时输出少了最高位。。。)
#include<iostream>
#include<string>
using namespace std;
#include"conio.h"

//子程序

//表示这是要用链表做的节奏
typedef struct node
{
    int data;
    struct node *next;
}node,*LinkList;

//单链表的初始化
int InitList(LinkList &L)
{//构造一个空的单链表L
    L=new node;//生成新结点作为头结点,用头指针L指向头结点
    L->next=NULL;//头结点的指针域置空
    return 1;
}

//前插法创建单链表
void CreateList_H(LinkList &L,string s)//这是一个函数
{//逆位序输入n个元素的值,建立带表头结点的单链表L
    LinkList p;
    int i,a;
    for(i=0;i<s.size();i++)
    {
        a=s[i]-'0';//将字符转化为数字
        p=new node;//生成新结点*p
        p->data=a;//输入元素赋值给新结点*p的数据域
        p->next=L->next;L->next=p;//将新结点*p插入到头结点之后
    }
}

//整数相加
void add(LinkList L1,LinkList L2,LinkList L)
{
    LinkList p,p1,p2;
    int d,num;
    p=L->next;
    p1=L1->next;
    p2=L2->next;
    d=0;
    //因为前插法是倒序,故,当L1,L2第一个都是数字的时候
    while(p1&&p2)
    {
        num=p1->data+p2->data+d;//L1和L2第一个数字相加考虑进位
        d=num/10;//进位时的那个1
        num=num%10;//留下进入L的数字
        p->data=num;
        p1=p1->next;
        p2=p2->next;
        p=p->next;
    }
    //当加到后来有一个数已经加完了,然后另一个数还有的状态。考虑进位。
    while(d&&p)
    {
        num=p->data+d;//由于上面已经把剩下的那个数给了L,所以用p->data。
        d=num/10;
        num=num%10;
        p->data=num;
        p=p->next;
    }
    //如果两边都加完了,就剩下一个可以进位的数字d
    if(d)
    {
        p=new node;//再开出一个结点来存放进位的d,但是看上一段程序可知已经到了p->next
        p->data=d;//那最后一个q,即r的数值就等于d
        p->next=NULL;//然后r的后面的后面就没有数字了
    }
}

//逆置
void inverse(LinkList &L)  
{  
    LinkList p,q,r;  
    p=L;  
    q=L->next;  
    p->next=NULL;  
    while(q)  
    {  
        r=q->next;  
        q->next=p->next;  
        p->next=q;  
        q=r;  
    }  
}  


//输出相加后的结果链表L
void output(LinkList L)
{
    LinkList p;
    p=L->next;
    while(p!=NULL)
    {
        cout<<p->data;
        p=p->next;
    }
    cout<<endl;
}

//主程序
int main()
{
    int T,k;
    cin>>T;
    for(k=0;k<T;k++)
    {
        string s1,s2;
        cin>>s1;
        cin>>s2;
        LinkList L1,L2,L;
        InitList(L1);
        InitList(L2);
        InitList(L);
        CreateList_H(L1,s1);
        CreateList_H(L2,s2);
        L=s1.size()>s2.size()?L1:L2;
        add(L1,L2,L);
        inverse(L);
        output(L);
    }
    return 0;
}
搜索更多相关主题的帖子: include return 子程序 元素 
2015-11-05 16:34
砍砍
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-11-5
收藏
得分:0 
太忧伤了,所以还是自己找大神解决了:
#include<iostream>
#include<string>
using namespace std;
#include"conio.h"

//子程序

//表示这是要用链表做的节奏
typedef struct node
{
    int data;
    struct node *next;
}node,*LinkList;

//单链表的初始化
int InitList(LinkList &L)
{//构造一个空的单链表L
    L=new node;//生成新结点作为头结点,用头指针L指向头结点
    L->next=NULL;//头结点的指针域置空
    return 1;
}

//前插法创建单链表
void CreateList_H(LinkList &L,string s)//这是一个函数
{//逆位序输入n个元素的值,建立带表头结点的单链表L
    LinkList p;
    int i,a;
    for(i=0;i<s.size();i++)
    {
        a=s[i]-'0';//将字符转化为数字
        p=new node;//生成新结点*p
        p->data=a;//输入元素赋值给新结点*p的数据域
        p->next=L->next;L->next=p;//将新结点*p插入到头结点之后
    }
}

//整数相加
void add(LinkList L1,LinkList L2,LinkList L)
{
    LinkList p,p1,p2,o,t;
    int d,num;
    o=L;
    p=L->next;
    p1=L1->next;
    p2=L2->next;
    d=0;
    //因为前插法是倒序,故,当L1,L2第一个都是数字的时候
    while(p1&&p2)
    {
        num=p1->data+p2->data+d;//L1和L2第一个数字相加考虑进位
        d=num/10;//进位时的那个1
        num=num%10;//留下进入L的数字
        p->data=num;
        p1=p1->next;
        p2=p2->next;
        p=p->next;
        o=o->next;
    }
    //当加到后来有一个数已经加完了,然后另一个数还有的状态。考虑进位。
    while(d&&p)
    {
        num=p->data+d;//由于上面已经把剩下的那个数给了L,所以用p->data。
        d=num/10;
        num=num%10;
        p->data=num;
        p=p->next;
    }
    //如果两边都加完了,就剩下一个可以进位的数字d
    if(d)
    {
        t=new node;//再开出一个结点来存放进位的d,但是看上一段程序可知已经到了p->next
        t->data=d;//那最后一个q,即r的数值就等于d
        t->next=NULL;//然后r的后面的后面就没有数字了
        o->next=t;
    }
}

//逆置
void inverse(LinkList &L)  
{  
    LinkList p,q,r;  
    p=L;  
    q=L->next;  
    p->next=NULL;  
    while(q)  
    {  
        r=q->next;  
        q->next=p->next;  
        p->next=q;  
        q=r;  
    }  
}  


//输出相加后的结果链表L
void output(LinkList L)
{
    LinkList p;
    p=L->next;
    while(p!=NULL)
    {
        cout<<p->data;
        p=p->next;
    }
    cout<<endl;
}

//主程序
int main()
{
    int T,k;
    cin>>T;
    for(k=0;k<T;k++)
    {
        string s1,s2;
        cin>>s1;
        cin>>s2;
        LinkList L1,L2,L;
        InitList(L1);
        InitList(L2);
        InitList(L);
        CreateList_H(L1,s1);
        CreateList_H(L2,s2);
        L=s1.size()>s2.size()?L1:L2;
        add(L1,L2,L);
        inverse(L);
        output(L);
    }
    return 0;
}
你猜会不会有人搜到它↑↑↑
2015-11-05 18:55
砍砍
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-11-5
收藏
得分:0 
回复 2楼 砍砍
好吧,其实这个也是不对的。。。
2015-11-08 13:13
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:20 
都string s1,s2了,为什么不加个s3存储结果呢?非要弄什么链子,即使弄个链子,也不需要逆置吧,把每位的相加结果都作为head不就行了。

能编个毛线衣吗?
2015-11-08 13:26
快速回复:大整数加法求改错(进位时输出少了最高位。。。)
数据加载中...
 
   



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

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