数据-怎么修改下面的代码,关于两数求和

问题描述

怎么修改下面的代码,关于两数求和
 #include<iostream>
#include<string>
#include<math.h>
using namespace std;
struct LinkNode
{
int data;                  //记录每个节点的整数(小于10000)
LinkNode *next;            //记录下一个节点的地址
LinkNode *prev;             //记录前一个节点的地址
};
class LinkList
{
private:
LinkNode *head0,*head1;      //head0,head1分别记录两个整数链表的头指针
LinkNode *currptr;
LinkNode *result;            //result记录结果链表的头指针
public:
LinkList();                   //构造函数,初始化链表
~LinkList();                 //析构函数,释放空间
void Creat(string a);        //引入字符串,创立两个链表,分别表示两个整数
void Add();                  //实现两个整数相加
void Display();              //显示结果
void addtwo();             //节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的
};
int sum(int n);
LinkList::LinkList()                //构造函数,初始化链表
{
head0=new LinkNode;              //申请一个空间记录整数的符号和节点数
head1=new LinkNode;
head0->next=head0;
head0->prev=head0;               //初始化链表,建立双向循环链表
head1->next=head1;
head1->prev=head1;
      result=new LinkNode;
result->next=result;
result->prev=result;
currptr=NULL;
}
LinkList::~LinkList()                        //析构函数,释放空间
{
LinkNode *p1=head0,*p2=head1,*p3=result;     //三个指针分别指向三条链表的头指针
while(p1!=p1->prev)
{
    p1->prev->next=p1->next;
    p1->next->prev=p1->prev;
    currptr=p1;
    p1=p1->next;
    delete currptr;
}
while(p2!=p2->prev)                        //逐个删除节点,释放空间
{
    p2->prev->next=p2->next;
    p2->next->prev=p2->prev;
    currptr=p2;
    p2=p2->next;
    delete currptr;
}
while(p3!=p3->prev)
{
    p3->prev->next=p3->next;
    p3->next->prev=p3->prev;
    currptr=p3;
    p3=p3->next;
    delete currptr;
}
// 删除 p1,p2,p3;
}   

void LinkList::Creat(string a)                   //引入字符串,创立两个链表,分别表示两个整数
{
int i=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0;         //i记录字符串,j记录加数节点数;s记录被加数节点数,w标记字符串中的'-'号,
                                            //k记录字符串中的字符转化为整数的值,l使每个节点记录4位
while(a[m]!=';') m++;            //m记录字符串中被加数的字符数
    n=m;
while(a[n]!='') n++;           //n记录字符串的总字符数
if(a[0]=='-')
{
    head0->data=(-1);              //记录整数符号
    w=1;
}
else {head0->data=1;}
for(i=m-1;i>=w;i--)
{
    if(a[i]!=',')                   //把字符转化为整数
    {
     k+=(a[i]-'0')*sum(l);
     l++;
    }
    if(a[i]==','||i==w)
    {
     currptr=new LinkNode;             //把整数存到双向循环链表中
     currptr->data=k;
     currptr->next=head0;
     currptr->prev=head0->prev;
     head0->prev->next=currptr;
     head0->prev=currptr;
     head0=currptr;
     s++;                               //节点数加1
     k=0;                               //重新初始化k和l
     l=0;
    }
}
      head0->prev->data*=s;             //存储整数符号和节点数
                                        //与建第一个整数链表一样,建立第二个整数链表head1
k=0;l=0;   

if(a[m+1]=='-')
{
    head1->data=(-1);
    m++;
}
else
    head1->data=1;
for(i=n-1;i>m;i--)
{
    if(a[i]!=',')
    {
     k+=(a[i]-'0')*sum(l);
     l++;
    }
    if(a[i]==','||i==m+1)
    {
     currptr=new LinkNode;
     currptr->data=k;
     currptr->next=head1;
     currptr->prev=head1->prev;
     head1->prev->next=currptr;
     head1->prev=currptr;
     head1=currptr;
     j++;
     k=0;
     l=0;
    }
}
head1->prev->data*=j;
}   

void LinkList::Add()                               //实现两个整数相加
{
LinkNode *temp;
if(abs(head0->prev->data)>abs(head1->prev->data)) //两个整数中,绝对值大的为被加数
    addtwo();
else if(abs(head0->prev->data)<abs(head1->prev->data))
{
    temp=head0;
    head0=head1;
    head1=temp;
    addtwo();
}
else if(abs(head0->prev->data)==abs(head1->prev->data))
{
    int k1,k2;
    LinkNode *p=head0,*q=head1;                //如果节点数相同,则判断节点中数值大小
while(p->data==q->data&&p!=head0->prev->prev&&q!=head1->prev->prev)
    {
     p=p->next;
     q=q->next;
    }
    k1=p->data;
    k2=q->data;
    if(k1>k2)
     addtwo();
    else
    {
    temp=head0;
    head0=head1;
    head1=temp;
    addtwo();
    }
}
}
void LinkList::addtwo()           //节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的
                                  //默认head0存的整数绝对值比head1大
{
int s=0,m1=head0->data,m2=head1->data;
m1=(head0->prev->data/abs(head0->prev->data));         //head0的符号
m2=(head1->prev->data/abs(head1->prev->data));         //head1的符号
LinkNode *p=head0->prev->prev,*q=head1->prev->prev;
result->data=head0->prev->data;            //存结果的节点数和符号
while(q!=head1->prev)           //head0存的整数绝对值比head1大,即head0的节点数大于或等于head1
{
    currptr=new LinkNode;
    currptr->data=(p->data)*m1+(q->data)*m2+s;     //两整数相加
    if((m1*m2)>0)                             //如果符号相同
    {
     if(abs(currptr->data)-10000>=0)       //相加后超过10000,则进位
     {
      s=currptr->data/10000;
      currptr->data=abs(currptr->data)%10000;
     }
     else                 //abs(currptr->data)-10000<0,不进位
     {
      s=0;
      currptr->data=abs(currptr->data);
     }
    }
    else if(m1>0&&m2<0)                 //符号不同,在此相当于实现两个正整数相减
    {
     s=0;
     if(currptr->data<0)               //小于0,向前一位借1
     {
      currptr->data+=10000;
      s=-1;
     }
    }
    else if(m1<0&&m2>0)
//符号不同,在此相当于实现负整数加上正整数
    {
     s=0;
     if(currptr->data>0)           //大于0,
     {
      currptr->data=10000-currptr->data;
      s=1;
     }
     else currptr->data=abs(currptr->data);
    }
    currptr->next=result;              //存入链表
    currptr->prev=result->prev;
    result->prev->next=currptr;
    result->prev=currptr;
    result=currptr;
    p=p->prev;
    q=q->prev;
}
       //当head0节点数比head1长时,继续建立链表
while(p!=head0->prev)
{
    currptr=new LinkNode;
    currptr->data=p->data*m1+s;
    s=currptr->data/10000;
    if((m1*m2)>0)
    {
     if(abs(currptr->data)-10000>=0)
     {
      s=currptr->data/10000;
      currptr->data=abs(currptr->data)%10000;
     }
     else {s=0;currptr->data=abs(currptr->data);}
    }
    else if(m1>0&&m2<0)
    {
     s=0;
     if(currptr->data<0)
     {
      currptr->data+=10000;
      s=-1;
     }
    }
    else if(m1<0&&m2>0)
    {
     s=0;
     if(currptr->data>0)
     {
      currptr->data=10000-currptr->data;
      s=1;
     }
     else currptr->data=abs(currptr->data);
    }
    currptr->data=abs(currptr->data)%10000;
    currptr->next=result;
    currptr->prev=result->prev;
    result->prev->next=currptr;
    result->prev=currptr;
    result=currptr;
    p=p->prev;
}
if(s!=0)                     //处理相加后,进位问题
{
    currptr=new LinkNode;
    currptr->data=abs(s);
    currptr->next=result;
    currptr->prev=result->prev;
    result->prev->next=currptr;
    result->prev=currptr;
    result=currptr;
    result->prev->data=m1*(abs(result->prev->data)+1);
}
}
void LinkList::Display()                     //显示结果
{
LinkNode *p=result;
int FuHao=result->prev->data/abs(result->prev->data);//结果的符号
while(p->data==0&&p!=result->prev->prev)            //当运算后前几个节点的数据为0时,不输出
{
    p=p->next;
    result->prev->data=(abs(result->prev->data)-1)*FuHao;    //结果记录非0节点数
}
cout<<FuHao*p->data;           //首先显示符号和第一个节点中的数
if(abs(result->prev->data)!=1) p=p->next; //判断非0节点数是否为1
while(p!=result->prev->prev)      //继续输出
{
    cout<<",";                 //每4位一组,并用','隔开
    cout.width(4);
       cout.fill('0');
          cout<<p->data;
          p=p->next;
}
if(p==result->prev->prev&&abs(result->prev->data)!=1) //显示最后一个节点数据
{
    cout<<",";
    cout.width(4);
       cout.fill('0');
          cout<<p->data;
}
cout<<endl;
}
int sum(int n)                    //计算10的乘方
{
int i,s=1;
for(i=1;i<=n;i++)
{
    s=s*10;
}
return s;
}
int main()                      //主函数
{
    cout<<"*         任意长整数的加法      *nn";
    cout<<"*  注意:输入时每四位用逗号隔开 *nn";
    cout<<"*         如:123456789         *nn";
    cout<<"*     输入格式为:1,2345,6789   *nn";
    cout<<"*       两个数之间用';'隔开     *nn";
    cout<<"n";
    string ch;
    cout<<"请输入整数1;整数2:n";
    cin>>ch;                                 //输入任意长字符串
    LinkList List;                          //定义链表对象
    List.Creat(ch);                       //把字符串转化为整数,并存到链表中
    List.Add();                             //实现两个整数相加
    cout<<"两整数的和为:";
    List.Display();                              //输出结果
}

这个代码里输入两个数的时候要用“;”隔开,这个地方怎么改成让它分别输入两个数然后相加,我改成下面这种但前面格式好像不对,不知道怎么改
string ch1,ch2;
cout<<"请输入整数1:n";

cin>>ch1;
cout<<"请输入整数2:n";

cin>>ch2;

LinkList List;

List.Creat(ch1,ch2);

List.Add();

cout<<"两整数的和为:";

List.Display();

}

解决方案

    string ch1,ch2,ch3;
    cout<<"请输入整数1:n";
    cin>>ch1;

    cout<<"请输入整数2:n";
    cin>>ch2;
    ch1=ch1+";"+ch2;
    LinkList List;
    List.Creat(ch1);

    List.Add();
    cout<<"两整数的和为:";
    List.Display();
时间: 2025-01-16 07:46:46

数据-怎么修改下面的代码,关于两数求和的相关文章

spring jdbctemplate使用queryforlist返回的数据不能修改么?

问题描述 spring jdbctemplate使用queryforlist返回的数据不能修改么? 我有两个表,表中各有一个类型字段,名称字段,数值字段,例 如下: 表1: 类型 名称 数值 文具 铅笔 2 耗材 纸 10 表2 类型 名称 数值 文具 铅笔 1 耗材 纸 1 表1存的是采购计划数据,表2存的是采购数据 我现在需要将两表的各自分类数据汇总后进行输出 我分别用两次jdbctemplate查询了两个表,并汇总了数据,现在需要将表2中与表1中类型.名称一致的数据加入表1的查询结果 St

一张表如何关联另一张表中的两条数据!出现错误!代码和表如下!在线等

问题描述 一张表如何关联另一张表中的两条数据!出现错误!代码和表如下!在线等 public DataTable GetScrapTirePage(StringBuilder SqlWhere, IList<SqlParam> IList_param, int pageIndex, int pageSize, ref int count) { StringBuilder strSql = new StringBuilder(); strSql.Append("select Base_S

c#代码-C#对SQLServer数据库中数据的修改

问题描述 C#对SQLServer数据库中数据的修改 在DataGridView中选中一行数据,使得对应列的内容显示在TextBox中,点击"修改"按钮,数据库中的信息被修改."修改"按钮和DataGridView在同一窗体. 解决方案 修改是一个连接 传一个ID前往另一个页面,获取出你修改的那条信息,然后建立一个模型生成get(),set()方法.用foreach()实例化gridview一个对象,把控件中的值存放在模型中,注意page_load()事件中用if(

修改一行SQL代码 性能提升了100倍

在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用 EXPLAN ANALYZE来优化代码,到后来,http://www.aliyun.com/zixun/aggregation/14171.html">Postgres社区也成为我们学习提升的一个好帮手,付出总会有回报,我们的性能也因此得到了极大的提升. 事出有因 Datadog是专门为IT.开发团队等提供监控服务

VC++植物大战僵尸中文版修改器实现代码_C 语言

本文实例讲述了VC++植物大战僵尸中文版修改器实现代码.分享给大家供大家参考.具体分析如下: 这是很简单的一个辅助工具,关键是游戏数据的分析,实现了两个功能,无限阳光和无冷却.特别注意的一下,如果用VS2008编译的话,调试的时候是正常的,但编译后功能就会失效,这是因为OpenProcess权限的问题,需要提权,在VC6下是正常的. void CzhiwuDlg::OnBnClickedButton1() { //无限阳光代码 HWND hJubing; DWORD lID; DWORD bas

前端开发调试线上代码的两款工具

原文:前端开发调试线上代码的两款工具 用过 Charles 和 Fiddler 这两款,记录如下.   一.Charles Charles 界面简单直观,易于上手,数据请求控制容易,修改也简单,抓取数据的开始暂停也方便.全平台支持 win,mac,linux.   1. 安装前提Charles 需要有 Java 环境,请提前下载安装 JDK.JDK 已经 8 了. 根据自己的系统选择对应的JDK.我的是 win7,双击安装,一直下一步就哦了.在命令行窗口输入以下命令,出现截图所示就表示 JDK

修改和创建DOM节点两种方式的4种优化方案

原文:<Speeding up JavaScript: Working with the DOM>作者:KeeKim Heng, Google Web Developer翻译:http://www.blogjava.net/emu/archive/2010/03/01/314185.html 在我们开发互联网富应用(RIA)时,我们经常写一些javascript脚本来修改或者增加页面元素,这些工作最终是DOM--或者说文档对象模 型--来完成的,而我们的实现方式会影响到应用的响应速度. DOM

ajax和ssh框架实现对遍历项的修改(求完整代码)

问题描述 ajax和ssh框架实现对遍历项的修改(求完整代码) 这是我的jsp代码,这里的数据是遍历的,求一个完整的代码,从ajax的传输,到action回应的 解决方案 解决方案二: 从后台返回来的应该是ArrayList<对象实体>,这样的结果应该是查询数据库中多行记录, 你只需要action中定义一个 private List listUser = null; private List getListUser() { if(reuslt == null){ return Collecti

VMware 虚拟化编程(10) — VMware 数据块修改跟踪技术 CBT

目录 目录 前文列表 数据块修改跟踪技术 CBT 为虚拟机开启 CBT CBT 修改数据块偏移量获取函数 QueryChangedDiskAreas changeId 一个 QueryChangedDiskAreas 的 DEMO 应用 QueryChangedDiskAreas 设计的增量差异备份算法 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化编程(2) - 虚拟磁盘文件类型详解 VMware 虚拟化编程(3