2026年9月6日(高精度)
2026-09-06 11:28:41
发布于:广东
//筛选质数
//埃氏筛/线性筛/暴力筛
//质数:除了1和本身以外不能被其他任何数整除的数字 2 3 5 7
//合数:除了1和本身以外能被其他数整除的数字
//找出/标记合数 剩下的就是质数
//埃氏筛
//对于合数x拆解为x=a*b*c...*d其中a,b,c,....,d都是质数
//问合数x至少拆解为多少个质数乘积的形式(两个)
//24=2*2*2*3 =4*6
//x=a*b;//对于min(a,b)的最大值为多少
//x=a*a=a^2 //a=sqrt(x);
bool is_prime(int x){//判断x是否为质数
if(x<=1)return false;
// for(int i=2;i<=sqrt(x);i++){
// for(int i=2;i*i<=x;i++){//更快
if(x%i==0)return false;
}
return true;
}
int_128
//int a=1e9/1e5/1e7 /2e9
单个int(32位)类型最大值上限2e9 2^31
单个long long(64位)类型最大值上限 1e18 2^63
int数组的大小上限3e7
int a[30000007]
// short 短整型long
//char
高精度减法
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;//string 字符串,动态字符数组 char a[0];
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string sum;
for(int i=0;i<max(a.size(),b.size());i++){
int tmpa=0,tmpb=0;
if(i<a.size())tmpa=a[i]-'0';
if(i<b.size())tmpb=b[i]-'0';
sum.push_back(tmpa+tmpb);
}
for(int i=0;i<sum.size()-1;i++){
if(sum[i]>=10){//进位
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
}
while(sum[sum.size()-1]>=10){
int tmp=sum[sum.size()-1]/10;
sum[sum.size()-1]=sum[sum.size()-1]%10;
sum.push_back(tmp);
}
for(int i=0;i<sum.size();i++)sum[i]+='0';
reverse(sum.begin(),sum.end());
cout<<sum<<endl;
}
高精度减法
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;//string 字符串,动态字符数组 char a[0];
cin>>a>>b;
string sum;//存储最终的计算结果
int flg=0;//结果是否为负数
//a-b;
//字典序比较
//32
//99
if(a.size()<b.size()||a.size()==b.size()&&a<b){
flg=1;//结果一定为负数]
swap(a,b);
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(int i=0;i<max(a.size(),b.size());i++){
int tmpa=0,tmpb=0;
if(i<a.size())tmpa=a[i]-'0';
if(i<b.size())tmpb=b[i]-'0';
sum.push_back(tmpa-tmpb);
}
for(int i=0;i<sum.size()-1;i++){
if(sum[i]<0){//进位
sum[i+1]--;
sum[i]+=10;
}
}
while(sum.size()>1&&sum.back()==0)sum.pop_back();
reverse(sum.begin(),sum.end());
for(int i=0;i<sum.size();i++)cout<<(int)sum[i];
}
高精度乘法
#include<bits/stdc++.h>
using namespace std;
int sum[100000];
int main(){
string a,b;//string 字符串,动态字符数组 char a[0];
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(int i=0;i<a.size();i++)
for(int j=0;j<b.size();j++){
int k=i+j;
int tmpa=a[i]-'0',tmpb=b[i]-'0';
sum[k]+=tmpa*tmpb;
}
int len=a.size()-1+b.size()-1;
for(int i=0;i<len;i++){
sum[i+1]+=sum[i]/10;//进位
sum[i]%=10;
}
for(int i=len;i>=0;i--)cout<<sum[i];
}
全部评论 1
我又来打卡了


2026-09-06 来自 海南
2终于遇到本人了!!


2026-09-10 来自 海南
0




















有帮助,赞一个