PAT A1059 Prime Factors(分解质因数板题)

2024-02-17 12:48

本文主要是介绍PAT A1059 Prime Factors(分解质因数板题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

给出一个int范围的整数,按照从小到大的顺序输出分解为质因数的乘法公式。

Sample Input:

97532468

Sample Output:

97532468=2^2*11*17*101*1291

Solution

分解质因数板题。注意:

  • 分解int范围正整数,素数表开10,000大小就够了。
  • n==1时,因为1不是素数需要单独判断。
  • 不要忘记处理>sqrt(n)的一个质因数。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
//数组不需要开到int型最大值那么大
//分解质因数后质因数不会太大
const int maxn = 10000;
bool judge_prime[maxn];
int prime[maxn];
int num_fac, num_prime = 0;
void get_prime()
{// 素数筛法得到素数表memset(judge_prime, true, sizeof(judge_prime));judge_prime[1] = judge_prime[0] = false;for (int i = 2; i < maxn; i++){if (judge_prime[i] == true)for (int j = i + i; j < maxn; j += i)judge_prime[j] = false;}for (int i = 2; i <= maxn; i++){if (judge_prime[i])prime[num_prime++] = i;}
}
struct Factor
{int x, count; //x为质因子,count为其个数初始化为0Factor(){count=0;}
} fac[100];
void prime_factor(int n)
{// n==1时单独处理if (n == 1)fac[num_fac++].x = 1, fac[num_fac].count = 1;else{// 从2到n的开方区间内判断质因数int bound = (int)sqrt(1.0 * n);for (int i = 0; i < num_prime && prime[i] <= bound; i++){if (n % prime[i] == 0){fac[num_fac].x = prime[i];while (n % prime[i] == 0){// 计算同一个质因数出现几次n = n / prime[i];fac[num_fac].count++;}num_fac++;}}// 如果无法被sqrt(n)以内的质因数除尽// 一定有一个>sqrt(n)的质因数if (n != 1){fac[num_fac].x = n;fac[num_fac].count++;num_fac++;}}
}
int main()
{// freopen("in.txt", "r", stdin);get_prime();int n;while (~scanf("%d", &n)){num_fac = 0;prime_factor(n);printf("%d=", n);for (int i = 0; i < num_fac; i++){if (i > 0)printf("*");printf("%d", fac[i].x);if (fac[i].count > 1)printf("^%d", fac[i].count);}printf("\n");}return 0;
}

这篇关于PAT A1059 Prime Factors(分解质因数板题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717802

相关文章

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩 目录 前言 一、特征值分解 二、应用特征值分解对图片进行压缩 三、矩阵的奇异值分解 四、应用奇异值分解对图片进行压缩 五、MATLAB仿真代码 前言         学习了特征值分解和奇异值分解相关知识,发现其可以用于图片压缩,但网上没有找到相应代码,本文在学习了之后编写出了图片压缩的代码,发现奇异值分

连分数因子分解法——C语言实现

参考网址:连分数分解法寻找整数的因子(Python)-CSDN博客 大数运算:C语言实现 大数运算 加减乘除模运算 超详细_64编程 加减乘除取模 复杂运算-CSDN博客 ‌连分数因子分解法‌是一种用于大整数因子分解的算法,它是计算数论中的一个重要方法。连分数因子分解法通过寻找x2≡y2 (mod p)x2≡y2 (mod p)的形式来分解N。具体来说,这种方法涉及到计算N的简单连分数展开,并

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解(VMD)2. 双向时域卷积(BiTCN)3. 双向门控单元(BiGRU)4. 注意力机制(Attention)总结流程 二、实验结果三、核心代码四、代码获取五、总结 时序预测|变分模态分解-双向时域卷积

HDU 1016 Prime Ring Problem (深搜)

OJ题目 : click here ~~ 大概题意:n个数,形成一个环,使得相邻两个数的和为素数。以1开始,按字典序输出序列。 很简单的深搜。 AC_CODE int n;int visit[22];int num[22];int len;bool Is_prime(int x){for(int i = 2;i*i <= x;i++)if(x%i == 0) return

《机器学习》 基于SVD的矩阵分解 推导、案例实现

目录 一、SVD奇异值分解 1、什么是SVD 2、SVD的应用         1)数据降维         2)推荐算法         3)自然语言处理 3、核心         1)什么是酉矩阵         2)什么是对角矩阵 4、分解过程 二、推导 1、如何求解这三个矩阵         1)已知:          2)根据酉矩阵的特点即可得出:

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i

等式(数论/唯一分解定理)

链接: https://www.nowcoder.com/acm/contest/90/F 来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数) 输入描述: 在第一行输入一个正整数T。接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。(1<=n<=1e9) 输出描述: 输出符合该方程要求的解数。