zoukankan      html  css  js  c++  java
  • 紫书 习题 10-8 UVa 10622(gcd)

    把这个数质因数分解然后求因子个数的gcd就ok了。

    一些细节

    (1)这道题的质因数不需要存下来,每一次做完取一次gcd就ok了

    (2)判断奇偶用ans & 1的时候要加括号, 位运算要注意括号

    (3)这道题在32位带符号整数范围内,也就是说用int可以了

    (3)注意ans最后的处理,看代码

    #include<cstdio>
    #include<vector>
    #include<cmath>
    #include<cstring>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 1123456;
    bool is_prime[MAXN];
    vector<int> prime;
    
    void init()
    {
    	memset(is_prime, true, sizeof(is_prime));
    	is_prime[0] = is_prime[1] = false;
    	REP(i, 2, MAXN)
    	{
    		if(is_prime[i]) prime.push_back(i);
    		REP(j, 0, prime.size())
    		{
    			if(i * prime[j] >= MAXN) break;
    			is_prime[i * prime[j]] = false;
    			if(i % prime[j] == 0) break;
    		}
    	}
    }
    
    int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
    
    int solve(int n)
    {
    	int t = n;
    	if(n < 0) n = -n;
    	int ans = 0;
    	REP(i, 0, prime.size())
    		if(n % prime[i] == 0)
    		{
    			int cnt = 0;
    			while(n % prime[i] == 0)
    			{
    				n /= prime[i];
    				cnt++;
    			}
    			ans = gcd(ans, cnt);
    			if(n == 1) break;
    		}
    	
    	if (ans == 0) ans = 1; //可能是一个非常大的质数,所以要加这个判断 
    	if (t < 0) 
    		while ((ans & 1) == 0) //加括号 
    			ans >>= 1;        //是负数的话答案必须是奇数,因为质因数里面只有2的偶数 
    	return ans;               //所以把2除完剩下一定是奇数 
    }
    
    int main()
    {
    	init();
    	int n;
    	while(~scanf("%d", &n) && n)
    		printf("%d
    ", solve(n));
    	return 0;
    }
  • 相关阅读:
    yml 配置文件注入
    STS 自动生成 getter 和 setter
    maven build 失败
    navicat 使用
    STS 设置 注解提示
    windows下安装Mysql
    安装 mysql
    用Navicat Premium 操作MySQL数据库
    渐变显示渐变消失的BackgroundView
    基于dispatch_after封装YXTimer
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819483.html
Copyright © 2011-2022 走看看