本篇文章主要是记录一下这一周的收获。
一.多个高精度相加。
之前在学习高精度的时候一直不知道怎么处理多个高精度数据连续相加,然后前几天看到蓝桥杯上面有一些题目,就研究了多个高精度相加,还有多个高精度相乘。
1.多个高精度相加
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int> a,vector<int> b)
{
int t=0;
vector<int> c;
for(int i=0;i<a.size()||i<b.size();i++)
{
if(i<a.size()) t+=a[i];
if(i<b.size()) t+=b[i];
c.push_back(t%10);
t/=10;
}
if(t) c.push_back(1);
return c;
}
int main()
{
string s1,s2,s3;
cin>>s1>>s2;
vector<int> a,b;
for(int i=s1.size()-1;i>=0;i--)
a.push_back(s1[i]-'0');
for(int i=s2.size()-1;i>=0;i--)
b.push_back(s2[i]-'0');
vector<int> c=add(a,b);
vector<int> p;
for(int i=2;i<4;i++)
{
cin>>s3;
vector<int> d;
for(int j=s3.size()-1;j>=0;j--)
d.push_back(s3[j]-'0');
p=add(c,d);
c=p;
}
for(int i=p.size()-1;i>=0;i--)
cout<<p[i];
return 0;
}
2.多个低精度相乘直接算算不出来时
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> a,int b)
{
int t=0;
vector<int> c;
for(int i=0;i<a.size()||t!=0;i++)
{
if(i<a.size()) t+=a[i]*b;
c.push_back(t%10);
t/=10;
}
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
int main()
{
string s1;
int b;
cin>>s1>>b;
vector<int> a;
for(int i=s1.size()-1;i>=0;i--)
a.push_back(s1[i]-'0');
vector<int> c=mul(a,b);
vector<int> p;
for(int i=2;i<100;i++)
{
cin>>b;
p=mul(c,b);
c=p;
}
for(int i=p.size()-1;i>=0;i--)
cout<<p[i];
return 0;
}
二.质数筛法
1.埃式筛法
这种筛法主要是采用删去质数的倍数从而留下质数,这种筛法的时间复杂度已经降到nloglogn,不过这种筛法的缺点是有些数字会被重复筛。
模板:
int st[1000];
int p[1000];
for(int i=2;i<=n;i++)
{
if(!st[i])
{
p[i]=1;
for(int j=i+i;j<=n;j+=i)
st[j]=1;
}
}
//p[i]为1的时候i是质数
2.线性筛法
线性筛法不会出现上面的那个问题,所有的数都仅仅是只会筛掉一遍。
模板:
int prime[1000];
int cnt=0;
int p[1000];
int st[1000];
for(int i=2;i<=n;i++)
{
if(!st[i]) prime[cnt++]=i,p[i]=1;
for(int j=0;prime[j]<=n/i;j++)
{
st[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
//p[i]=1时,i为质数
完结!!!