6 条题解

  • 1
    @ 2022-6-18 12:37:19

    首先简化题意,就是让我们判断一个数能否拆成两个素数,于是就可以直接暴力枚举,我们不难写出这样的代码:

    #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;
    }
    

    数据得增强......

    完结撒花!

    • @ 2025-7-4 9:34:11

      只要细心看代码就不难看出第三个代码的第二行的分号是中文的,实际上是在C++里测了才知道的

  • 0
    @ 2026-3-21 12:28:31
    #include<bits/stdc++.h>
    using namespace std;
    bool pd(int g){
    	if(g==1)return 0;
    	for(int i=2;i<=sqrt(g);i++)if(g%i==0)return 0;
    	return 1;
    }
    int main(){
    	int n;
    	cin>>n;
    	for(int i=2;i<=sqrt(n);i++){
    		if(n%i==0){
    			int j=n/i;
    			if(pd(i)&&pd(j)){
    				cout<<"It's a Tongtong number.";
    				return 0;
    			}
    		}
    	}
    	cout<<"It's not a Tongtong number.";
    	return 0;
    }
    
    • 0
      @ 2024-3-21 7:13:44

      很水:

      #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
      @ 2023-10-2 10:53:24

      既然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
        @ 2022-7-25 11:28:16
        #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;
        }
        • -2
          @ 2026-3-18 21:45:19
          #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. YOU ARE BIG GAY";
          	return 0;
          }
          
          • @ 2026-4-6 15:17:09

            注意第20行 YOU ARE BIG GAY

        • 1

        信息

        ID
        36
        时间
        1000ms
        内存
        256MiB
        难度
        6
        标签
        (无)
        递交数
        233
        已通过
        76
        上传者