高精度+素数判断小优化(6N+1)

——————出自南昌理工学院ACM

高精其实理解了就很好解决,下面让我们一起来看看高精度算法的新萌小模板,如有不足还望指教。
高精加法:
这里有些学长喜欢用二维数组的去处理,新萌在这里用的是三个一位数组处理。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
    int n,m,pd=0;
    cin>>n>>m;
    n=m-n;
	int a[1200]={0},b[1200]={0},c[1200]={0};
	a[1]=1;
	b[1]=2;
	for(int i=1;i<=n-2;i++){
        for(int j=1;j<1200;j++){
            c[j]=b[j]+a[j];

        }
        for(int j=1;j<1200;j++){
            while(c[j]>9){
                c[j+1]++;
                c[j]-=10;

            }
        }
        for(int j=1;j<1200;j++){
            a[j]=b[j];
        }
        for(int k=1;k<1200;k++){
            b[k]=c[k];
        }
        memset(c,0,sizeof(c));
	}
	if(n==1)cout<<1;
	else if(n==0)cout<<0;
	else
	for(int i=1200-1;i>=1;i--){
            if(!pd&&b[i]==0)continue;
        cout<<b[i];pd=1;
	}
	return 0;
}

高精减法:

#include<iostream>
#include<cstring>
using namespace std;
char s1[10088],s2[10088];
int a[10088],b[10088],c[10088];
int main(){
    int len1,len2,len3,i;
    cin>>s1+1;
    cin>>s2+1;
    len1=strlen(s1+1);
    len2=strlen(s2+1);
    if(len1<len2||(len1==len2&&strcmp(s1,s2)<0)){
        cout<<'-';
        swap(s1,s2);
        swap(len1,len2);
    }
    len3=max(len1,len2);
    for(i=1;i<=len1;i++){
        a[len1-i+1]=s1[i]-'0';
    }
    for(i=1;i<=len2;i++){
        b[len2-i+1]=s2[i]-'0';
    }
    for(i=1;i<=len3;i++)
    {
        c[i]=c[i]+a[i]-b[i];
        if(c[i]<0){
            c[i]+=10;
            c[i+1]--;
        }
    }
    while(c[len3]==0)len3--;
    if(len3<1)cout<<0;
    else
    for(i=len3;i>0;i--)
        cout<<c[i];
    return 0;
}

高精乘法:
高精乘(int,long long)类型
这里就没有写高精乘高精,概念差不多

#include<iostream>
#include<cstring>
using namespace std;
char s1[2001],s2[2001];
int a[2001],b[2001],c[2001],i,j,len1,len2,len3;
int main(){
    cin>>s1+1;
    cin>>s2+1;
    len1=strlen(s1+1);
    len2=strlen(s2+1);
    for(i=1;i<=len1;i++)
        a[len1+1-i]=s1[i]-'0';
    for(i=1;i<=len2;i++)
        b[len2-i+1]=s2[i]-'0';
    len3=len1+len2-1;
    for(i=1;i<=len1;i++)
    {
        for(j=1;j<=len2;j++){
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
    }
    while(c[len3+1]>0)len3++;
    while(c[len3]==0&&len3!=1)len3--;
    for(i=len3;i>0;i--)
        cout<<c[i];
    return 0;
}

6N+1是判断这个数是否是素数的一种较好的方法。它能够大大降低时间程序的复杂度。

int isPrime(long long num) {
    if(num<=1) return 0;
    if(num==2||num==3) return 1;
    if(num%6!=1&&num%6!=5) return 0;
    for(long long i=5; i*i<=num; i+=6)
        if(num%i==0||num%(i+2)==0) return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值