- 高士渠 的博客
day10
- @ 2025-7-24 19:44:27
今日题算难,总是要用最优解;
约数定义:若a能整除b,则b是a的约数;
质数定义:质数只有1和它本身两个约数,只在>1的整数中讨论;
例题 J31401判定质数
http://www.turing-code.com/d/sqjx2025/p/J31401
题目描述:输入n个ai,判断每个ai是不是质数,是输出Yes,不是输出No;
方法:从2枚举所有<n的数,优化:遍历从2到n的平方根;
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a;
cin>>a;
for(int j=1;j<=a;j++){
int n,t=1;
cin>>n;
for(int i=2;i<n/i;i++){
if(n%i==0){
t=0;
break;
}
}
if(n==1){
cout<<"No"<<endl;
continue;
}
if(t==0)cout<<"No"<<endl;
else if(t==1)cout<<"Yes"<<endl;
}
return 0;
}
2例题 J31403找质数
http://www.turing-code.com/d/sqjx2025/p/J31403 题目描述:
方法:从2开始遍历数,若该数未标记,则为质数并要标记它<n的倍数;
代码:
#include<bits/stdc++.h>
using namespace std;
int v[10000010];
int main() {
int n,sum=0;
cin>>n;
for(int i=2;i<=n;i++){
if(v[i]==1)continue;
sum++;
for(int j=2;j<=n/i;j++){
if(i*j>n)break;
v[i*j]=1;
}
}
cout<<sum;
return 0;
}
J31404求约数
http://www.turing-code.com/d/sqjx2025/p/J31404
思路:遍历从1到n的平方根,若n可以整除i并且ii!=n,此时,i和n/i都是n的约数,若n可以整除i但是ii==n,i为n的约数,这样可以去重;
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
long long a;
cin>>a;
vector<int>x;
for(int j=1;j<=a/j;j++){
if(a%j==0&&a/j!=0){
x.push_back(j);
x.push_back(a/j);
}
else if(a%j==0)x.push_back(j);
}
sort(x.begin(),x.end());
for(int j=0;j<x.size();j++)cout<<x[j]<<" ";
cout<<endl;
}
return 0;
}
J31402分解质因数
http://www.turing-code.com/d/sqjx2025/p/J31402
题目思路:遍历从2到a的平方根,找出能被a整除的质数,也就是a的质因数,输出它;
正确代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int j=1;j<=n;j++){
int a;
cin>>a;
for(int i=2;i*i<=a;i++){
if(a%i==0){
int x=0;
while(a%i==0){
a/=i;
x++;
}
cout<<i<<" "<<x<<endl;
}
}
if(a>1)cout<<a<<" 1"<<endl;
cout<<endl;
}
return 0;
}
J31407 最大公约数
http://www.turing-code.com/d/sqjx2025/p/J31407
题目描述:输入n,输入n个ai,bi,输出它们的最大公因数;
#include<bits/stdc++.h>
using namespace std;
int v(int a,int b){
while(b!=0){
int x=b;
b=a%b;
a=x;
}
return a;
}
int main(){
int n;
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
cout<<v(a,b)<<endl;
}
return 0;
}
182.快速幂
http://www.turing-code.com/d/sqjx2025/p/182 快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在 \Theta(\log n) 的时间内计算 a^n 的小技巧,而暴力的计算需要 \Theta(n) 的时间。