CCFCSP202312-2因子化简 (质数筛法)C/C++ 满分
具体思路:先用质数筛法找到1000以内的全部质数,然后逐一处理即可。
·
C/C++题解:
具体思路:先用质数筛法找到1000以内的全部质数,然后逐一处理即可
#include<bits/stdc++.h>
using namespace std;
int q;
long long n,k,ans;
vector<long long> Sushu;
void is_prime(){
bool isPrime[1001];
for(int i=2;i<=1000;i++){
isPrime[i]=true;
}
for(int i=2;i*i<=1000;i++){
if(isPrime[i]){
for(int j=i*i;j<=1000;j+=i){
isPrime[j]=false;
}
}
}
for(int i =2;i<=1000;i++){
if(isPrime[i]){
Sushu.push_back(i);
}
}
}//false为合数
int main(){
is_prime();
cin >> q;
while(q--){
cin >> n >> k;
ans = 1;
int flag = 0,curK = 0;
while(n>1&&flag<Sushu.size()){
if(n%Sushu[flag] == 0){
curK ++;
n /= Sushu[flag];
}else{
if(curK<k){
curK = 0;
flag++;
continue;
}
for(int i = 0;i<curK;i++){
ans*=Sushu[flag];
}
curK = 0;
flag++;
}
}
if(curK >= k){
for(int i = 0;i<curK;i++){
ans*=Sushu[flag];
}
}
cout << ans << endl;
}
}
···
Update 2024.05.14
最近重新做这题,优化了一下代码,可能更好理解
#include<bits/stdc++.h>
using namespace std;
vector<int> primes;
#define ll long long
void isPrime(){
bool Prime[1001];
for(int i = 0;i<=1000;i++){
Prime[i] = true;
}
Prime[1] = false;
for(int i = 2;i*i<=1000;i++){
if(Prime[i]){
for(int j = i*i;j<=1000;j+=i){
Prime[j] = false;
}
}
}
for(int i = 2;i<=1000;i++){
if(Prime[i]){
primes.push_back(i);
}
}
}
int main(){
isPrime();
int q;
cin >> q;
for(int i = 0;i<q;i++){
ll n,k;
cin >> n >> k;
ll ans = 1;
for(int j = 0;j<primes.size();j++){
int tk = 0;
if(n<=0){
break;
}
while(n%primes[j] == 0){
n/=primes[j];
tk++;
}
if(tk<k){
tk = 0;
}
for(int i = 0;i<tk;i++){
ans *= primes[j];
}
}
cout << ans << endl;
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)