3 条题解

  • 1
    @ 2026-8-11 18:35:23
    • 核心结论:两个数的所有公因数,恰好就是它们最大公约数 (gcd) 的全部因数。

    • 比如:12和18的最大公因数为6,6的全部因数为1,2,3,6,也就是12和18的全部公因数。

    • 步骤:

    1. 算出 (g = \gcd(x,y))
    2. 找出数字 g 所有正因数
    3. 从小到大排序输出

    代码如下:

    #include<bits/stdc++.h>//万能头 
    using namespace std;
    typedef long long ll;//该题数字大于int的范围,用typedef使long long简写为ll; 
    ll gcd(ll a,ll b){//找到a和b的最大公因数 
    	while(b!=0){
    		ll t=a%b;
    		a=b;
    		b=t;
    	}
    	return a;//返回最大公因数的值 
    }
    int main(){
    	ll x,y;
    	cin >>x >>y;//输入数据 
    	ll g=gcd(x,y);//把返回值赋给g 
    	vector<ll> num;//用来储存g的因数
    	for(ll i=1;i*i<=g;i++){//一个数的因数对数不超过这个数的算术平方根 
    		if(g%i ==0){//当i能被g整除时,i为g的因数 
    			num.push_back(i);//把i添加进去 
    			if(i!=g/i) num.push_back(g/i);
    			//因为因数都是成对出现的,所以只要用g/i就能找到与i成对的数,但要避免相同因数(if(i!=g/i)) 
    		}
    	}
    	sort(num.begin(),num.end());//将因数从小到大排序 
    	//输出: 
    	for(ll i=0;i<num.size();i++){
    		if(i!=0) cout<<" ";
    		cout<<num[i];
    	}
    	return 0;
    }
    
    
    • 1
      @ 2026-6-15 17:44:53
      #include<bits/stdc++.h>
      using namespace std;
      int main(){
      	long long a,b;
      	cin>>a>>b;
      	if((a%2!=0 || b%2!=0) && //这边的特判,用最朴素的方式拦截质数,不进入下面的暴力循环
      	   (a%3!=0 || b%3!=0) && 
      	   (a%5!=0 || b%5!=0) && 
      	   (a%7!=0 || b%7!=0) && 
      	   (a%11!=0 || b%11!=0) && 
      	   (a%13!=0 || b%13!=0) && 
      	   (a%17!=0 || b%17!=0) && 
      	   (a%19!=0 || b%19!=0)){
      		cout<<1;
                      return 0;//是质数直接输出1,并且推出
      	}
      	for(long long i=1;i<=min(a, b);i++){
      		if(a%i==0 && b%i==0){
      			cout<<i<<" ";//暴力枚举
      		}
      	}
      	return 0;
      } 
      

      可以80分,供参考

      • 0
        @ 2026-6-17 18:03:53

        题意

        • 给定两个正整数 xxyy,求它们的所有公共因数,从小到大输出
        • 公共因数指的是能够同时整除 xxyy 的数

        部分分

        • 性质 1:x106x \le 10^6y106y\le 10^6 (35 分)
          • 直接枚举 [1,x][1, x],然后判定其是否可以被 xxyy 整除
          • 能够被整除,直接输出即可
        • 性质 2:x106x \le 10^6y106y\le 10^6 (30 分)
          • 【或】字意味着存在另一个数可能达到 101210^{12}
          • 第一点,用 long long 读入
          • 然后和上面一样写就行了,只不过枚举 [1,106][1, 10^6]
        • 性质 3:xxyy 是质数(15 分)
          • 只需要判断 11xx 或者 11yy
          • 那么直接判断三个数 {1,x,y}\{1, x, y\} 就到手了

        题解(全部得分,前置知识:素数判定的 O(n)O(\sqrt n) 写法)

        • 简单的考虑,能够同时整除 xxyy 那么可以先把所有能够整除 xx 的数找出来

        • 对于这些数判定其是否能够被 yy 整除,能够就记录

        • 最后排序输出

          const int N = 1e6 + 9;
          
          // 因为一个数的因数个数不超过根号个,所以数组长度开根号(1e6)即可
          long long ans[N];	
          
          void solved() {
          	
          	long long x, y;	cin >> x >> y;
          	
          	// 对 x 计算所有的因数
          	int n = 0;
          	for(long long i = 1; i * i <= x; i ++) {
          		if(x % i != 0) continue;
          		
          		if(y % i == 0) ans[++ n] = i;
          		
          		if(i * i == x) continue;	// 重复因子
          		
          		if(y % (x / i) == 0) ans[++ n] = x / i;
          	}
          	
          	sort(ans + 1, ans + n + 1);	// 从小到大排序
          	
          	for(int i = 1; i <= n; i ++) cout << ans[i] << ' ';
          	
          	return ;
          }
        
        • 1

        信息

        ID
        166
        时间
        1000ms
        内存
        256MiB
        难度
        2
        标签
        递交数
        88
        已通过
        12
        上传者