算法笔记-第五章-质因子分解

算法笔记-第五章-质因子分解

  • 小试牛刀
    • 质因子2的个数
    • 丑数
  • 质因子分解
  • 最小最大质因子
  • 约数个数

小试牛刀

质因子2的个数

算法笔记-第五章-质因子分解_第1张图片

#include  
int main()  
{
	int n;  
	scanf_s("%d", &n);  
	int count = 0;  
	while (n % 2 == 0)  
	{
		count++;  
		n /= 2;  
	}
	printf("%d", count);  
	return 0;  
}

丑数

算法笔记-第五章-质因子分解_第2张图片
算法笔记-第五章-质因子分解_第3张图片

#include 

int main() {
    int n;
    scanf("%d", &n);
    while (n % 2 == 0) {   
        n /= 2;   
    }
    while (n % 3 == 0) {   
        n /= 3;   
    }
    while (n % 5 == 0) {   
        n /= 5;   
    }
    printf(n == 1 ? "Yes" : "No");   
    return 0;   
}

质因子分解

算法笔记-第五章-质因子分解_第4张图片
算法笔记-第五章-质因子分解_第5张图片


#include 
#include 
#include 
#include 
using namespace std;

const int MAXN = 1000 + 1;
bool isPrime[MAXN];//布尔函数,用于指定可以为倍数的因子
vector<int> primes;//存储指定的倍数因子

void getPrimes(int n) 
{
    memset(isPrime, true, sizeof(isPrime));//对于布尔数组isprime进行复制true
    for (int i = 2; i <= n; i++) //可以为倍数的从2开始到n(数的开方)
    {
        if (isPrime[i]) //选取可以为倍数的因子
        {
            primes.push_back(i);//放到数组当中
           
                                //并且下面对于访问过的倍数进行标记
            for (int j = i + i; j <= n; j += i) 
            {
                isPrime[j] = false;
            }
        }
    }
}

int main() {
    int n;
    scanf("%d", &n);
    getPrimes((int)sqrt(1.0 * n));//数的开方(带入到访问因子当中)



    for (int i = 0; i < primes.size() && n > 1; i++) //下面是进行因子判断和统计了
    {
        int counter = 0;//每一次都是统计每一个因子的数目

        while (n > 1 && n % primes[i] == 0) 
        {
            counter++;
            n /= primes[i];  
        }

        if (counter > 0) //统计后进行输出数据  
        {
            printf("%d %d\n", primes[i], counter);  
        }
    }

    if (n > 1)   
    {
        printf("%d 1", n);  
    }
    return 0;  
}

最小最大质因子

算法笔记-第五章-质因子分解_第6张图片

//最小最大质因子
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF = 0x3f;//表示无穷大数
const int MAXN = 1000 + 1;
bool isPrime[MAXN];
vector<int> primes;

void getPrimes() 
{
    memset(isPrime, true, sizeof(isPrime));//将布尔函数进行赋值
    for (int i = 2; i < MAXN; i++)
    {
        if (isPrime[i])
        {
            primes.push_back(i);
            for (int j = i + i; j < MAXN; j += i) //将倍数因子进行标记
            {
                isPrime[j] = false;
            }
        }
    }
}

int main() 
{
    int n, x;
    scanf("%d", &n);
    getPrimes();//将倍数因子进行标记操作


    int minFactor = INF, maxFactor = 0;


    for (int i = 0; i < n; i++) 
    {
        scanf("%d", &x);
        for (int j = 0; j < primes.size() && x > 1; j++)   
        {
            int counter = 0;  
            while (x > 1 && x % primes[j] == 0)//求得因子  
            {
                counter++;//统计因子数目  
                x /= primes[j];  
            }


            if (counter > 0) //取得因子最小值和因子最大值  
            {
                minFactor = min(minFactor, primes[j]);  
                maxFactor = max(maxFactor, primes[j]);  
            }
        }

        //最后条件:x除以prime[j]还有数且>1时候  
        if (x > 1)   
        {
            minFactor = min(minFactor, x);  
            maxFactor = max(maxFactor, x);  
        }

    }

    printf("%d %d", minFactor, maxFactor);  
    return 0;  
}

约数个数

算法笔记-第五章-质因子分解_第7张图片

#include 
#include 
#include 
#include 
using namespace std;

const int MAXN = 1000 + 1;
bool isPrime[MAXN];
vector<int> primes;


void getPrimes(int n) 
{
    memset(isPrime, true, sizeof(isPrime));
    for (int i = 2; i <= n; i++) 
    {
        if (isPrime[i]) 
        {
            primes.push_back(i);
            for (int j = i + i; j <= n; j += i)
            {
                isPrime[j] = false;
            }
        }
    }
}

int main() {
    int n;
    scanf("%d", &n);
    getPrimes((int)sqrt(1.0 * n));

    int result = 1;
    for (int i = 0; i < primes.size() && n > 1; i++) 
    {
        int counter = 0;
        while (n > 1 && n % primes[i] == 0) 
        {
            counter++;
            n /= primes[i];
        }
        if (counter > 0) 
        {
            result = result * (counter + 1);
        }
    }
    if (n > 1) 
    {
        result = result * 2;
    }
    printf("%d", result);
    return 0;
}

你可能感兴趣的:(#,算法笔记刷题,算法,笔记)