标签:数据
大数的相关计算问题一直是编程比赛常考的题目,在蓝桥杯比赛之前又把大数的加减乘法做了一遍。大数除法比较难,还没有去尝试实现,以后有机会了再继续补全好了。
算法分析:三种方法相似,都是按位操作,动态存储。处理好输入数据后,对每一位的逐个操作,很容易得到答案。
大数加法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define MAX 1010
using namespace std;
string A,B;
int a[MAX],b[MAX];
int sum[MAX];
int T,l1,l2;
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
cin>>A;cin>>B;
bool flag=true;
l1=A.length();
l2=B.length();
for( int i = l1-1; i >= 0; i-- )
a[l1-1-i]=A[i]-‘0‘;
for( int i = l2-1; i >= 0; i-- )
b[l2-1-i]=B[i]-‘0‘;
for( int i = 0; i < max(l1,l2)+2; i++ )
{
sum[i]+=a[i]+b[i];
if( sum[i] >= 10 )
{
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
}
for( int i = MAX-1; i >= 0; i-- )
{
if( sum[i] == 0 && flag )
continue;
flag=false;
printf("%d",sum[i]);
}
printf("\n");
}
大数减法
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 210
using namespace std;
char a[MAX];
char b[MAX];
char c[MAX];
int l1,l2;
bool flag=false;
int num1[MAX],num2[MAX];
bool if_exchange();
void exchange();
void Minus(int x);
void Print();
int main()
{
while( gets(a)&&gets(b) )
{
l1=l2=0;
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
memset(c,0,sizeof(c));
flag=if_exchange();
for( int i = strlen(a)-1; i >= 0 ; i-- )
{
num1[l1]=a[i]-‘0‘;
l1++;
}
for( int i = strlen(b)-1; i >= 0 ; i-- )
{
num2[l2]=b[i]-‘0‘;
l2++;
}
for( int i = 0; i < l1; i++ )
Minus(i);
Print();
}
return 0;
}
bool if_exchange()
{
if( strlen(a) < strlen(b) )
{
exchange();
return true;
}
else if( strlen(a) == strlen(b) )
{
for( int i = 0; i < (int)strlen(a); i++ )
{
if( a[i] > b[i] )
break;
else if( a[i] < b[i] )
{
exchange();
return true;
}
else
continue;
}
}
return false;
}
void exchange()
{
strcpy(c,a);
strcpy(a,b);
strcpy(b,c);
return ;
}
void Minus(int x)
{
if( num1[x] >= num2[x] )
num1[x]-=num2[x];
else
{
num1[x+1]--;
num1[x]=num1[x]+10-num2[x];
}
return ;
}
void Print()
{
int i;
bool sflag=true;
if( flag )
cout<<‘-‘;
for( i = l1-1; i >= 0;i-- )
{
if( sflag && num1[i]==0 )
continue;
else
{
sflag=false;
printf("%d",num1[i]);
}
}
if( sflag )
cout<<0;
cout<<endl;
return ;
}
大数乘法
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 210
using namespace std;
char a[MAX];
int l1,l2;
int length;
int num1[MAX],num2[MAX];
int save[2*MAX];
void Time(int x);
void Print();
int main()
{
l1=l2=0;
length=0;
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
memset(save,0,sizeof(save));
gets(a);
for( int i = strlen(a)-1; i >= 0 ; i-- )
{
num1[l1]=a[i]-‘0‘;
l1++;
}
gets(a);
for( int i = strlen(a)-1; i >= 0 ; i-- )
{
num2[l2]=a[i]-‘0‘;
l2++;
}
for( int i = 0; i < l1; i++ )
Time(i);
Print();
cout<<endl;
return 0;
}
void Time(int x)
{
int ass=num1[x];
int tem[MAX];
int lmax=0;
memset(tem,0,sizeof(tem));
for( int i = 0; i < l2; i++ )
{
int mid=ass*num2[i];
tem[i]+=mid;
tem[i+1]+=tem[i]/10;
tem[i]%=10;
lmax=i+1;
if(tem[i+1]!=0)
lmax++;
}
for( int i = x; i < x+lmax; i++ )
{
save[i]+=tem[i-x];
save[i+1]+=save[i]/10;
save[i]%=10;
length=i;
if( save[i+1]!=0 )
length++;
}
return ;
}
void Print()
{
bool flag=true;
int i;
for( i = length; i >= 0; i-- )
{
if( flag && save[i]==0 )
continue;
else
{
flag=false;
printf("%d",save[i]);
}
}
if( i < 0 && flag == true )
cout<<0;
return ;
}
标签:数据
原文地址:http://blog.csdn.net/eashion1994/article/details/44805035