4 条题解

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

          数据得增强......

          完结撒花!

          • 1

          信息

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