超长整数的加减法

来源:互联网 发布:windows socket失败 编辑:程序博客网 时间:2024/04/29 04:47

闲来无事随便写写。

 

乘除法下次再写。仅供大家参考。

 

编写语言:C++,编译环境:VS2005

 

下面是代码:

 

// 长整数加法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
using namespace std;

//////////////////////////////////////
struct num_array
{
 int number;
 int carry_num;
};


bool get_num(num_array* num_p, string num, int num_array_leg, int num_leg, int num_add);

bool clear(num_array* num_p, int num_array_leg);

bool add(num_array* num1_p, num_array* num2_p, int array_leg);

bool sub(num_array* num1_p, num_array* num2_p, int array_leg, int num1_leg, int num2_leg);

bool sub_value(num_array* num1_p, num_array* num2_p, int array_leg);

bool cmp(num_array* num1_p, num_array* num2_p, int array_leg, int num1_leg, int num2_leg);

void print(num_array* num_p, int array_leg);
////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
 string num1;
 string num2;

 int num1_leg=0, num2_leg=0;
 int num1_array_leg=0, num2_array_leg=0, array_leg=0;
 
 cout<<"input num1: ";
 getline(cin, num1);
 cout<<"input num2: ";
 getline(cin, num2);
 
 num1_leg=(int)num1.length();
 num2_leg=(int)num2.length();

 num1_array_leg=num1_leg/5+1;
 num2_array_leg=num2_leg/5+1;

 if(num1_array_leg>=num2_array_leg)
  array_leg=num1_array_leg;
 else
  array_leg=num2_array_leg;

 int num1_add=5-num1_leg%5;
 int num2_add=5-num2_leg%5;

 num_array* num1_p=new num_array[array_leg];
 num_array* num2_p=new num_array[array_leg];

 clear(num1_p, array_leg);
 clear(num2_p, array_leg);
 
 get_num(num1_p, num1, array_leg, num1_leg, num1_add);
 get_num(num2_p, num2, array_leg, num2_leg, num2_add);

  
  string option;
  
redo: cout<<"choose add or sub: ";
  cin>>option;
  if("add"==option)
   add(num1_p, num2_p, array_leg);
  else if("sub"==option)
   sub(num1_p, num2_p, array_leg, num1_leg, num2_leg);
  else
  {
   cout<<"Error!/nPlease choose again: ";
   goto redo;
  }

 system("pause");
 return 0;
}


bool get_num(num_array* num_p, string num, int array_leg, int num_leg, int num_add)
{
 const int i=5;
 int count2=array_leg-1, count1=num_leg-1, temp=0;

 do
 {
  if(count1>=5)
  {
   temp=count1-4;
   for(int i=0; i<5; i++)
   {
    num_p[count2].number=num_p[count2].number*10+(num[temp]-'0');
    temp++;
   }
   count1-=5;
   count2--;
  }
  if(count1<5)
  {
   for(int i=0; i<=count1; i++)
   {
    num_p[count2].number=num_p[count2].number*10+(num[i]-'0');
   }
   count2--;
   count1=0;
  }
 }while(count1>0&&count2>0);
 return true;
}

 

bool clear(num_array* num_p, int num_array_leg)
{
 for(int count=0; count<num_array_leg; count++)
 {
  num_p[count].number=0;
  num_p[count].carry_num=0;
 }
 return true;
}

bool add(num_array* num1_p, num_array* num2_p, int array_leg)
{
 int count=0, temp=0, carry_num=0;
 
 for(count=array_leg-1; count>=0; count--)
 {
  temp=num1_p[count].number+num2_p[count].number+num1_p[count].carry_num;
  if(temp>=100000)
  {
   carry_num=temp/100000;
   temp=temp-100000*carry_num;
   num1_p[count-1].carry_num=carry_num;
  }
  num1_p[count].number=temp;
 }
 print(num1_p, array_leg);
 cout<<endl;
 return true;
}

bool sub_value(num_array* num1_p, num_array* num2_p, int array_leg)
{
 int count=0, temp=0, carry_num=0;
 
 for(count=array_leg-1; count>=0; count--)
 {
  if(num1_p[count].number>=num2_p[count].number)
  {
   num1_p[count].number=num1_p[count].number-num2_p[count].number;
  }
  else if(count>0)
  {
   num1_p[count].number+=100000;
   num1_p[count-1].number-=1;
   num1_p[count].number=num1_p[count].number-num2_p[count].number;
  }
  else
  {
   num1_p[count].number=num1_p[count].number-num2_p[count].number;
  }
 }
 return true;
}
bool cmp_value(num_array* num1_p, num_array* num2_p, int count, int array_leg)
{
 if(num1_p[count].number>num2_p[count].number)
 {
  return true;
 }
 else if(num1_p[count].number<num2_p[count].number)
 {
  return false;
 }
 else if(num1_p[count].number==num2_p[count].number)
 {
  if(count!=array_leg)
  {
   cmp_value(num1_p, num2_p, count+1, array_leg);
  }
  else if(count==array_leg)
  {
   return true;
  }

 }
}
bool cmp(num_array* num1_p, num_array* num2_p, int array_leg, int num1_leg, int num2_leg)
{
 int count=0;
 if(num1_leg>num2_leg)
 {
  return true;
 }
 else if(num1_leg==num2_leg)
 {
  return cmp_value(num1_p, num2_p, count, array_leg);
 }
 else if(num1_leg<num2_leg)
 {
  return false;
 }
}
bool sub(num_array* num1_p, num_array* num2_p, int array_leg, int num1_leg, int num2_leg)
{
 if(cmp(num1_p, num2_p, array_leg, num1_leg, num2_leg)==true)
 {
  sub_value(num1_p, num2_p, array_leg);
  print(num1_p, array_leg);
 }
 else
 {
  cout<<"-";
  sub_value(num2_p, num1_p, array_leg);
  print(num2_p, array_leg);
 }
 return true;
}
void print(num_array* num_p, int array_leg)
{
 int first_num=0, count=0;
 for(count=0; count<array_leg; count++)
 {
  if(num_p[count].number==0)
  {
   first_num++;
   continue;
  }
  else if(num_p[count].number!=0)
  {
   //first_num=count;
   break;
  }
 }

 for(count=first_num; count<array_leg; count++)
 {
  if(num_p[count].number!=0)
  {
   cout<<num_p[count].number;
  }
  else if(num_p[count].number==0)
  {
   cout<<"00000";
  }
 }
 if(first_num==array_leg)
  cout<<"0";
}

原创粉丝点击