4 条题解
-
1
既然n的质因数只有2个,那么我们只要分解
只因数质因数,统计质因数个数即可。 代码如下:#include<bits/stdc++.h> using namespace std; long long n,s,i=2; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);//关闭输入输出流 // freopen(".in","r",stdin); // freopen(".out","w",stdout);//这两句是废话 cin>>n;//输入 while(n!=1){//分解质因数 while(n%i==0){ n/=i; ++s;//统计质因数个数 } ++i; } if(s==2)cout<<"It's a Tongtong number.";//判断 else cout<<"It's not a Tongtong number."; }
-
0
很水:
#include <bits/stdc++.h> using namespace std; int n; bool prime (int n) { if (n<2) return false; for (int i=2;i*i<=n;i++) if (n%i==0) return false; return true; } int main() { cin>>n; for (int i=2;i*i<=n;i++) { if (prime (i) && prime (n/i) && n%i==0) { cout<<"It's a Tongtong number."; return 0; } } cout<<"It's not a Tongtong number."; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; long n,i,s,j,x,k; long pd(long n) { if(n<2)return 0; for(long i=2;i<=sqrt(n);i++)if(n%i==0)return 0; return 1; } int main() { cin>>n; for(i=2;i<=sqrt(n);i++) if(pd(i)&&n%i==0&&pd(n/i)){//只要能拆分成两个素数就可以了 cout<<"It's a Tongtong number."; return 0; } cout<<"It's not a Tongtong number."; return 0; }
-
0
首先简化题意,就是让我们判断一个数能否拆成两个素数,于是就可以直接
暴力枚举,我们不难写出这样的代码:#include <bits/stdc++.h> using namespace std; bool p=true; bool Itsprime(int n) { if(n<2) return false; for(int i=2; i<=n; i++) { if(n%i==0) return false; } return true; } int main () { int n; cin>>n; for(int i=1; i<=n; i++) { if(n%i==0&&Itsprime(i)&&Itsprime(n/i)) { cout<<"It's a Tongtong number."; p=false; } } if(p) cout<<"It's not a Tongtong number."; return 0; }
但是,我们却发现这个代码连样例也过不了。找错后发现,多了好几个It's a Tongtong number.所以,我们如果搜到了正确的答案,应该及时break或return 0。然后就能写出这样的代码(
马蜂较差不喜勿喷):#include <bits/stdc++.h> using namespace std; bool p=true; bool Itsprime(int n) { if(n<2) return false; for(int i=2; i<=sqrt(n); i++) { //如果这个数是合数,则他在2~sqrt(n)的部分一定有一个因数,sqrt(n)代表这个数的算术平方根自动舍去小数部分的结果,如果不明白可以看下面。 if(n%i==0) return false; } return true; } int main () { int n; cin>>n; for(int i=1; i<=n; i++) { if(n%i==0&&Itsprime(i)&&Itsprime(n/i)) { cout<<"It's a Tongtong number."; p=false; break; //如果这里写return 0,则下面无需判断p是否为真 } } if(p) cout<<"It's not a Tongtong number."; return 0; }
这样,就通过了样例。但是,如果看一下数据范围(n<=2^31-1),就不难发现,即使是单重循环,也会
T飞。因此我们必须优化循环。先从简单的开始:10的因数有:1,2,5,10;而sqrt(10)的值是3,不难发现,在2~3的范围,有10的质因数,那么就可以推出另一个因数,从而判断。
sqrt(2^31-1)约等于45000,则单重循环肯定可以AC。 代码如下:
#include <bits/stdc++.h> using namespace std; bool p=true; bool Itsprime(int n) { if(n<2) return false; for(int i=2; i<=sqrt(n); i++) { if(n%i==0) return false; } return true; } int main () { int n; cin>>n; for(int i=2; i<=sqrt(n); i++) { //核心部分 if(n%i==0&&Itsprime(i)&&Itsprime(n/i)) { cout<<"It's a Tongtong number."; p=false; break; } } if(p) cout<<"It's not a Tongtong number."; return 0; }
PS:由于n查询的范围较大,此题虽然可以用埃氏筛水过(数据真的好水),但是如果数据比较极(du)端(liu),如2147483646,则程序会查询p[2]和p[2147483646/2]/*(p代表线性筛数组,是一个bool类型),bool数组最多只能开10^9,所以会导致RE。
非正解但能AC的代码:
#include <bits/stdc++.h> using namespace std; #define int long long int n; bool p[10000010]; inline void prime(int x) { p[1]=true; for(int i=2; i*i<=x; ++i) { if(!p[i]) { for(int j=2; i*j<=x; ++j) { p[i*j]=true; } } } } signed main() { cin>>n; prime(10000000); for(int i=1; i<=10000000; ++i) { if(!p[i]&&n%i==0) { if(!p[n/i]) { cout<<"It's a Tongtong number."; return 0; } } } cout<<"It's not a Tongtong number."; return 0; }
数据得增强......
完结撒花!
- 1
信息
- ID
- 36
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 190
- 已通过
- 54
- 上传者