c语言编程:用单链表实现两个无限大的两个数的加法和乘法,并将两个数从低位到高位(如:100输出00

c语言编程:用单链表实现两个无限大的两个数的加法和乘法,并将两个数从低位到高位(如:100输出00,第1张

// 本程序主要由三个文件构成:
// BigIntegerh 包涵了对节点的结构定义,以及类BigInteger的定义
// BigIntegercpp 包涵了BigInteger类里面成员函数的具体内容
// maincpp 主函数
//
//BigIntegerh
struct Node        //定义了节点的结构
{
 char Num;
 Node Prev,Next;
};
class BigInteger      //定义BigInteger 类
{
 Node Head,End,TempNode;
 void AddHead(char Num);
 void AddEnd(char Num);
 public:
  BigInteger();
  BigInteger(const BigInteger &BigNum);
  void GetNumber();
  void disp();
  BigInteger operator + (const BigInteger &BigNum);
  BigInteger operator  (const BigInteger &BigNum);
  BigInteger operator = (const BigInteger &BigNum);
  ~BigInteger();
};
//BigIntegercpp
#include <iostreamh>
#include <stdioh>
#include "BigIntegerh"
BigInteger::BigInteger()        //构造函数,将每个节点置空
{
 Head=End=TempNode=NULL;
}
BigInteger::BigInteger(const BigInteger &BigNum)     //拷贝构造
{
 Node p;
 Head=End=TempNode=NULL;
 p=BigNumHead;
 while(p)
 {
  AddEnd(p->Num);
  p=p->Next;
 }
}
BigInteger::~BigInteger()        //析构
{
 Node NextNode;
 if(Head==NULL)
  return;
 TempNode=Head;
 while(TempNode)
 {
  NextNode=TempNode->Next;
  delete TempNode;
  TempNode=NextNode;
 }
 Head=NULL;
 End=NULL;
 TempNode=NULL;
}
void BigInteger::AddHead(char Num)        //在链表头插入节点的 *** 作
{
 TempNode=new Node;
 TempNode->Num=Num;
 TempNode->Prev=NULL;
 if(!Head)
 {
  Head=End=TempNode;
  TempNode->Next=NULL;
 }
 else
 {
  TempNode->Next=Head;
  Head->Prev=TempNode;
  Head=TempNode;
 }
}
void BigInteger::AddEnd(char Num)       //在链表尾插入节点的 *** 作
{
 TempNode=new Node;
 TempNode->Num=Num;
 TempNode->Next=NULL;
 if(!Head)
 {
  Head=End=TempNode;
  TempNode->Prev=NULL;
 }
 else
 {
  TempNode->Prev=End;
  End->Next=TempNode;
  End=TempNode;
 }
}
void BigInteger::GetNumber()            //输入部分
{
 char key;
 int count=0,num=0;
 while((key=getchar())!=10)            //判断输入的是否是回车,不是的话将内容从后到前放到链表中
 {
  if(key>='0' && key<='9')
  {
   num=key-'0';
   AddEnd(num);
   num=0;
  }
 }
}
BigInteger BigInteger::operator + (const BigInteger &BigNum2)    //重载"+"
{
 BigInteger &BigNum1=this,result;
 Node temp1,temp2;
 int TempNum,rest=0;
 temp1=BigNum1End;            //将临时链表首地址放置到输入链表的尾部
 temp2=BigNum2End;
 while(temp1 && temp2)
 {
  TempNum=int(temp1->Num)+int(temp2->Num)+rest;         //节点内元素相加并加上进位rest
  if(TempNum>9)                  //判断相加结果是否会产生进位
  {
   TempNum=TempNum-10;
   rest=1;
  }
  else
   rest=0;
  resultAddHead(char(TempNum));          //将结果放置到最终结果链表里
  temp1=temp1->Prev;
  temp2=temp2->Prev;
 }
 if(temp2)temp1=temp2;
 while(temp1)
 {
  int(TempNum)=int(temp1->Num)+rest;           //节点内元素加上进位rest
  if(TempNum>9)
  {
   TempNum=TempNum-10;
   rest=1;
  }
  else
   rest=0;
  resultAddHead(char(TempNum));             //将结果放置到最终结果链表里
  temp1=temp1->Prev;
 }
 if(rest)
  resultAddHead(char(rest));                //考虑最后的进位是否存在,如果存在则存入链表的首部
 return result;
}
BigInteger BigInteger::operator  (const BigInteger &BigNum2)     //对进行重载
{
 BigInteger &BigNum1=this,temp,result;
 Node temp1,temp2,tempa,tempb;
 int TempNum,rest,i=0,rest2;
 temp1=BigNum1End;
 temp2=BigNum2End;
 while(temp2)        //由乘数的存在与否判断是否去乘被乘数的每个位
 {
  rest=0;
  while(temp1!=NULL)
  {
   TempNum=int(temp1->Num)int(temp2->Num)+rest;
   if(TempNum>9)
   { 
    rest=TempNum/10;                 //进位由相乘结果与10做商求得
    TempNum=TempNum%10;                 //由相乘结果与10求模取个位
   }
   else
    rest=0;
   tempAddHead(char(TempNum));        //存入临时链表
   temp1=temp1->Prev;
  }
  if(rest!=0)tempAddHead(char(rest));
  for(int k=i;k>=1;k--)tempAddEnd(char(0));       //判断应该在链表后面补几个0
  i++;            //每次乘完后计数,用来下一次的补0
  temp1=BigNum1End;             //把被乘数重新置到尾,用来让乘数下一次去乘每个元素
  temp2=temp2->Prev;              //将乘数取出链表的前驱
  tempa=resultEnd;                  //下面进行的是将每次乘数与被乘数的相乘结果累加放到最终链表里等待输出
  if(resultHead!=NULL)           //下面过程与"+"重载基本一样,只是多了对临时链表的置空,所以不在做详细的注释
  {
   resultEnd=tempHead;
   resultHead=NULL;
  }
  tempb=tempEnd;
  rest2=0;
  while(tempa!=NULL && tempb!=NULL)
  {
   TempNum=int(tempa->Num)+int(tempb->Num)+rest2;
   if(TempNum>9)
   {
    TempNum=TempNum-10;
    rest2=1;
   }
   else
    rest2=0;
   resultAddHead(char(TempNum));
   tempa=tempa->Prev;
   tempb=tempb->Prev;
  }
  if(tempb)tempa=tempb;
  while(tempa)
  {
   int(TempNum)=int(tempa->Num)+rest2;
   if(TempNum>9)
   {
    TempNum=TempNum-10;
    rest2=1;
   }
   else
    rest2=0;
   resultAddHead(char(TempNum));
   tempa=tempa->Prev;
  }
  if(rest2)
   resultAddHead(char(rest2));
  if(tempHead!=NULL)
  {
   tempEnd=tempHead;
   tempHead=NULL;
  }
  tempb=NULL;
 }
 return result;
}
BigInteger BigInteger::operator = (const BigInteger &BigNum)          //对=号进行重载
{
 if(this==&BigNum)
  return this;
 Node p;
 TempNode=Head=End=NULL;
 p=BigNumHead;
 while(p)
 {
  AddEnd(p->Num);
  p=p->Next;
 }
 return this;
}
void BigInteger::disp()                    //输出链表
{
 if(Head)
 {
  cout<<int(Head->Num);
  TempNode=Head->Next;
 }
 else return;
 while(TempNode)
 {
  cout<<int(TempNode->Num);
  TempNode=TempNode->Next;
 }
 cout<<endl;
}
//maincpp
#include <iostreamh>
#include "BigIntegerh"
void main()
{
 BigInteger BigNum1,BigNum2,BigNum3;
 int c;
 cout<<"选择你要进行的 *** 作:"<<endl;
 cout<<"1大整数加法运算"<<endl;
 cout<<"2大整数乘法运算"<<endl;
 cout<<"选择你需要进行的运算:"<<endl;
 cin>>c;
 switch(c)
 {
  case 1:
   { 
    cout<<"A:"<<endl;
    BigNum1GetNumber();
    cout<<"B:"<<endl;
    BigNum2GetNumber();
    BigNum3=BigNum1+BigNum2;
    cout<<"相加的结果是:"<<endl;
    BigNum3disp();
   }break;
  case 2:
   {
    cout<<"A:"<<endl;
    BigNum1GetNumber();
    cout<<"B:"<<endl;
    BigNum2GetNumber();
    BigNum3=BigNum1BigNum2;
    cout<<"相乘的结果是:"<<endl;
    BigNum3disp();
   }break;
  default:break;
 }
}

C语言格式化输出默认为右对齐,+表示右对齐,-表示左对齐
printf ("%-08ld\n",y)默认在后面补两个' ',不可能补0,补0就改变了数值大小,所以和0没关系
printf ("%08ld\n",y)为右对其,前补0,结果都为-0043456
printf ("%+8ld\n",y)为右对齐,前补空格,结果为-43456 注意:此处的星号表示空格!!(因为打空格怕你看不出来。。。)

截图是在C-Free50环境下的运行结果。因为b是float类型,在%2f格式下输出的是050,而a是int类型,小数部分被截除,整数部分为零,所以输出为0。要说明的是,对于赋值运算符=,先进行运算符“=“右边部分的运算,然后将表达式的运算结果赋给“=”左边的变量。

#include<stdioh>

void main()

{

char ch;                         /声明变量/

for (ch = 'a'; ch <= 'z'; ch++)  /小写字母/

{

printf("%c:%4d   ", ch, ch);

if (ch%5 == 0)               /输出格式控制/

putchar('\n');

}

printf("\n\n");

for (ch = 'A'; ch <= 'Z'; ch++)  /大写字母/

{

printf("%c:%4d   ", ch, ch);

if (ch%5 == 0)               /输出格式控制/

putchar('\n');

}

system("pause");                          /任意键退出/

}

扩展资料:


注意事项

1、在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来 检验是否出现错误的一种方法,一般分奇校验和偶校验两种。

奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规 定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

2、因为1位二进制数可以表示(21=)2种状态:0、1;而 2位二进制数可以表示(22)=4种状态:00、01、10、11;依次类推,7位二进制数可以表示(27=)128种状态,每种状态都唯一地编为一个7 位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所以,7位ASCII码是用七位二进制数进行编码的,可以表示 128个字符。

第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;

第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10361695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存