很多小伙伴对计算机编程的算法感兴趣,但在很多竞赛类算法网站中,大数运算往往是必考的,而课本有基本未提及,所以,小编今天来提供算法的基本运算的源码(加减)。
对于大多数大数运算,往往是超出int 的范围,比如有2的100次方,100的100次方等等,或是超过题目内存限制,这时大数运算就能大展身手,其实,大数运算其实就是字符串的运算,再将其与结构体相结合。所以,对字符串和结构体还不熟悉的小伙伴建议先去复习这两方面的知识点。废话不多说,献上代码
#include<iostream>
#include<string.h> //注意包含此头文件
using namespace std;
struct beg //首先定义结构体
{
int d[1000]; //存储每个数码
int len; //记录大数长度
beg() //构造函数初始化结构体
{
memset(d,0,sizeof(d));
len=0;
}
};
struct beg change(char str[]);
struct beg add(beg a,beg b);
struct beg sub(beg a,beg b);
void show(struct beg c);
int com(beg a,beg b);
int main()
{
beg a,b,c;
char str1[1000],str2[1000];
cin>>str1;
cin>>str2;
a=change(str1);
b=change(str2);
c=add(a,b);
show(c);
int i;
i=com(a,b);
if(i<0) //若为负数,交换两个结构体变量
{
struct beg temp;
temp=a;
a=b;
b=temp;
c=sub(a,b);
cout<<"-"; //记得添负号
show(c);
}
else
{
c=sub(a,b);
show(c);
}
return 0;
}
//转换函数,将字符型转换为整型
struct beg change(char str[])
{
beg a;
a.len=strlen(str);
for(int i=0;i<a.len;i++)
{
a.d[i]=str[a.len-i-1]-'0'; //字符转整型
}
return a;
}
//加法函数
struct beg add(beg a,beg b)
{
beg c;
int carry=0; //carry用来记录进位情况,初始位0
for(int i=0;i<a.len||i<b.len;i++)
{
int temp=a.d[i]+b.d[i]+carry; //当前位想加再加进位
c.d[c.len++]=temp%10; //得到余数
carry=temp/10; //下一个进位情况
}
if(carry!=0) //若最高位不为0
{
c.d[c.len++]=carry;
}
return c;
}
//减法函数(注意是大减小)
struct beg sub(beg a,beg b)
{
beg c;
for(int i=0;i<a.len||i<b.len;i++)
{
if(a.d[i]<b.d[i]) //若遇到当前位不够减的情况
{
a.d[i+1]--; //向更高位借1
a.d[i]+=10; //再当前位加10
}
c.d[c.len++]=a.d[i]-b.d[i]; //进行减法
}
while(c.len-1>=1&&c.d[c.len-1]==0)
{
c.len--; //去除高位为0的情况,同时确保有最低位
}
return c;
}
//输出函数
void show(struct beg c)
{
for(int i=c.len-1;i>=0;i--)
{
cout<<c.d[i];
}
cout<<endl;
}
//比较大小函数
int com(beg a,beg b)
{
if(a.len>b.len) return 1;
else if(a.len<b.len) return -1;
else
{
for(int i=a.len-1;i>=0;i--)
{
if(a.d[i]<b.d[i]) return -1;
else if(a.d[i]>b.d[i]) return 1;
}
}
return 0;
}
小伙伴们慢慢咀嚼消化这些知识吧!