超长整数的加减法
来源:互联网 发布: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";
}
- 超长整数的加减法
- 用双向链表实现超长整数加减法
- 长整数的加减法
- 100以内整数的加减法运算
- 超长整数字符串乘法的算法
- 超长整数的输入与输出
- 超长整数的基础运算 之小结
- 字符串加减法(整数,小数)
- 整数高精度之加减法
- 大整数加减法
- 大整数加减法
- 大整数加减法
- 大整数加减法
- 定点整数加减法
- 超长整数加法计算
- 超长整数相加
- OJ------超长整数相加
- 关于大整数类加减法算法的一些思考
- HTTP协议基础--回味
- gb2312字符集
- 嵌入式操作系统(Embedded Operating System)一览
- 我的ffmpeg移植日记(1)
- 截取单元格内超长的字符串并用当鼠标指上去时显示全部字符串
- 超长整数的加减法
- ibatis
- ctl
- 遇见与错过
- 本书作者签名VIP版限量销售,并赠送本支持站VIP会员资格
- C#正则表达式快速入门
- log的详解
- iBATIS实现的一个例子
- 常用的C#正则表达式!