4 条题解

  • 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
    @ 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;
      }
      • 1

      信息

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