今天学了高精度计算,感觉几乎所有算法都差不多,下面是加法与减法的代码,结合poj1503:
//高精度计算
//加法
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define Max 100
#define Maxn(a,b) (a)>(b)?(a):(b)
int an1[Max+10];
int an2[Max+10];
char ch[Max+10];
void Addition(int *a1,int &len1,int *a2,int len2);
int check(int *a1,int len);
int main()
{
an1[0]=0;
int len1=1;
int i,j;
while(scanf("%s",ch)!=EOF)
{
if(strcmp(ch,"0")==0)
break;
int Len=strlen(ch);
for(i=0,j=0;i<Len;i++)
an2[j++]=ch[Len-i-1]-'0';
Addition(an1,len1,an2,j);
}
for(i=len1-1;i>=0;i--)
printf("%d",an1[i]);
return 0;
}
void Addition(int *a1,int &len1,int *a2,int len2)
{
int Len=Maxn(len1,len2),i;
for(i=len1;i<=Len;i++)
a1[i]=0;
for(i=len2;i<=Len;i++)
a2[i]=0;
for(i=0;i<Len;i++)
a1[i]+=a2[i];
len1=check(a1,Len);
}
int check(int *a1,int len)
{
for(int i=0;i<len;i++)
{
if(a1[i]>9)
{
a1[i+1]+=a1[i]/10;
a1[i]%=10;
}
}
if(a1[len]!=0)
return len+1;
return len;
}
高精度减法:
//高精度减法(两个数)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define Max 100
#define Maxn(a,b) (a)>(b)?(a):(b)
char ch1[Max+10];
char ch2[Max+10];
int an1[Max+10];
int an2[Max+10];
int Subtract(int *a1,int len1,int *a2,int len2);
int main()
{
int i,j,len1,len2;
while(scanf("%s%s",ch1,ch2)!=EOF)
{
if(strcmp(ch1,"0")==0)
break;
len1=strlen(ch1);
len2=strlen(ch2);
for(i=len1-1,j=0;i>=0;i--)
an1[j++]=ch1[i];
for(i=len2-1,j=0;i>=0;i--)
an2[j++]=ch2[i];
switch(Subtract(an1,len1,an2,len2))
{
case -1:printf("wrong\n"); break;
case 0: printf("0\n");break;
default:
for(i=len1-1;i>=0;i--)
printf("%d",an1[i]);
printf("\n");
}
}
return 0;
}
int Subtract(int *a1,int len1,int *a2,int len2)
{
int i;
if(len1<len2)
return -1;
for(i=len2;i<len1;i++)
a2[i]=0;
for(i=len1-1;i>=0;i--)
{
if(a1[i]<a2[i])
return -1;
else if(a1[i]>a2[i])
break;
}
if(i<0)
return 0;
for(i=0;i<len1;i++)
{
a1[i]-=a2[i];
if(a1[i]<0)
{
a1[i+1]-=1;
a1[i]+=10;
}
}
return 1;
}
乘法:poj2389
代码:
//高精度乘法 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; #define Max 200 char ch1[Max+10]; char ch2[Max+10]; int an1[Max]; int an2[Max]; int an[2*Max]; void Multiply(int *an1,int *an2); int main() { int i,j; scanf("%s%s",ch1,ch2); int len1=strlen(ch1); int len2=strlen(ch2); memset(an2,0,sizeof(an2)); memset(an1,0,sizeof(an1)); memset(an,0,sizeof(an)); for(i=len1-1,j=0;i>=0;i--) an1[j++]=ch1[i]-'0'; // for(i=0;i<j;i++) // cout << an1[i]; for(i=len2-1,j=0;i>=0;i--) an2[j++]=ch2[i]-'0'; Multiply(an1,an2); for(i=2*Max-1;an[i]==0 && i>=0;i--); if(i<0) printf("0\n"); else { for( ;i>=0;i--) printf("%d",an[i]); printf("\n"); } return 0; } void Multiply(int *an1,int *an2) { int i,j; for(i=0;i<Max;i++) for(j=0;j<Max;j++) an[i+j]+=an1[i]*an2[j]; for(i=0;i<2*Max;i++) if(an[i]>9) { an[i+1]+=an[i]/10; an[i]%=10; } } //高精度除法
以上就是最基本的高精度算法了,当然还有其他的类型不过总体的解决办法大同小异。。。。//Substract--array #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; #define Max 200 char ch1[Max+10]; char ch2[Max+10]; int an1[Max+10]; int an2[Max+10]; int an[Max+10]; int n; int Substract(int *a1,int *a2,int len1,int len2); int main() { scanf("%d",&n); int i,j,len1,len2; int t; while(n--) { scanf("%s%s",ch1,ch2); if(ch2[0]=='0'){ printf("wrong\n"); continue; } len1=strlen(ch1); len2=strlen(ch2); if(len1<len2) { printf("0\n"); continue; } //memset(an1,0,sizeof(an1)); memset(an2,0,sizeof(an2)); memset(an,0,sizeof(an)); for(i=len1-1,j=0;i>=0;i--) an1[j++]=ch1[i]-'0'; for(i=len2-1,j=0;i>=0;i--) an2[j++]=ch2[i]-'0'; int ntime=len1-len2; if(ntime>0) { for(i=len1-1;i>=len2;i--) an2[i]=an2[i-ntime]; for( ;i>=0;i--) an2[i]=0; len2=len1; } for(i=0;i<=ntime;i++) { while((t=Substract(an1,an2+i,len1,len2-i))>=0) { len1=t; an[ntime-i]++; } } for(i=Max+9;i>=0;i--) if(an[i]) break; if(i>=0) for( ;i>=0;i--) printf("%d",an[i]); else printf("0"); printf("\n"); } return 0; } int Substract(int *a1,int *a2,int len1,int len2) { int i; if(len1<len2) return -1; if(len1==len2) { for(i=len1-1;i>=0;i--) if(a1[i]>a2[i]) break; else if(a1[i]<a2[i]) return -1; } for(i=0;i<len1;i++) { a1[i]=a1[i]-a2[i]; if(a1[i]<0) { a1[i+1]--; a1[i]+=10; } } for(i=len1-1;i>=0;i--) if(a1[i]) return i+1; return 0; }