1059. Prime Factors (25)-PAT甲级真题(素数表的建立)

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1^k1 * p2^k2 *…*pm^km.

Input Specification:

Each input file contains one test case which gives a positive integer N in the range of long int.

Output Specification:

Factor N in the format N = p1^k1 * p2^k2 *…*pm^km, where pi's are prime factors of N in increasing order, and the exponent ki is the number of pi -- hence when there is only one pi, ki is 1 and must NOT be printed out.

Sample Input:

97532468

Sample Output:

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

题目大意:给出一个整数,按照从小到大的顺序输出其分解为质因数的乘法算式

分析:根号int的最大值不会超过50000,先建立个50000以内的素数表,然后从2开始一直判断是否为它的素数,如果是就将a=a/i继续判断i是否为a的素数,判断完成后输出这个素数因子和个数,用state判断是否输入过因子,输入过就要再前面输出“*”

#include <cstdio>
#include <vector>
using namespace std;
vector<int> prime(50000, 1);
int main() {
    for(int i = 2; i * i < 50000; i++)
        for(int j = 2; j * i < 50000; j++)
            prime[j * i] = 0;
    long int a;
    scanf("%ld", &a);
    printf("%ld=", a);
    if(a == 1) printf("1");
    bool state = false;
    for(int i = 2; i < 50000 && a >= 2; i++) {
        int cnt = 0, flag = 0;
        while(prime[i] == 1 && a % i == 0) {
            cnt++;
            a = a / i;
            flag = 1;
        }
        if(flag) {
            if(state) printf("*");
            printf("%d", i);
            state = true;
        }
        if(cnt >= 2) printf("^%d", cnt);
    }
    if (a > 1) printf("%s%ld", state ? "*" : "", a);
    return 0;
}
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 以下是Python实现: ```python def is_prime(n): """判断一个数是否为素数""" if n < 2: return False for i in range(2, int(n**0.5)+1): if n % i == 0: return False return True # 创建三个文件 file_a = open('a.txt', 'w') file_b = open('b.txt', 'w') file_c = open('c.txt', 'w') # 写入素数 for i in range(1, 10000): if is_prime(i): if i < 100: file_a.write(str(i) + '\n') elif i < 1000: file_b.write(str(i) + '\n') else: file_c.write(str(i) + '\n') # 关闭文件 file_a.close() file_b.close() file_c.close() ``` 首先定义一个函数 `is_prime` 判断一个数是否为素数,然后创建三个文件并逐个写入素数,最后关闭文件。判断素数的方法是,如果一个数可以被 2 到根号下它本身之间的任意整数整除,那么它就不是素数。 ### 回答2: 要将1-9999之间的素数分别保存在三个文件中,首先需要一个判断素数的函数。 判断素数的函数可以按照以下步骤进行设计: 1. 定义一个函数`is_prime(number)`,用于判断一个数字`number`是否为素数。 2. 如果`number`小于等于1,则返回False,因为1不是素数。 3. 如果`number`等于2或3,则返回True,因为2和3是素数。 4. 如果`number`能够被2整除,则返回False,因为除了2之外,其他偶数都不是素数。 5. 对于大于3的数字,我们只需要判断其是否能够被2到`number`的平方根之间的整数整除即可。 6. 使用一个循环从2开始,直到`number`的平方根,逐个判断是否能够整除。如果能够整除,则返回False。 7. 如果循环结束后都没有能够整除的数字,则返回True,说明`number`是素数。 有了判断素数的函数后,我们可以按照以下步骤将素数分别保存到三个文件中: 1. 创建三个文件a.txt、b.txt和c.txt。 2. 使用一个循环,从1到9999遍历每个数字。 3. 对于每个数字,调用判断素数的函数进行判断。 4. 根据判断结果,将该数字写入相应的文件中。如果该数字是素数,则写入a.txt、b.txt或c.txt中相应的文件中。 5. 循环结束后,关闭所有文件。 下面是实现该功能的部分Python代码: ```python def is_prime(number): if number <= 1: return False if number == 2 or number == 3: return True if number % 2 == 0: return False for i in range(2, int(number ** 0.5) + 1): if number % i == 0: return False return True # 创建文件 file_a = open('a.txt', 'w') file_b = open('b.txt', 'w') file_c = open('c.txt', 'w') # 将素数写入文件 for number in range(1, 100): if is_prime(number): file_a.write(str(number) + '\n') for number in range(100, 1000): if is_prime(number): file_b.write(str(number) + '\n') for number in range(1000, 10000): if is_prime(number): file_c.write(str(number) + '\n') # 关闭文件 file_a.close() file_b.close() file_c.close() ``` 注意,以上代码仅是部分示例,并未考虑异常处理和文件不存在的情况。在实际应用中,还需要进行适当的补充和改进。 ### 回答3: 首先,素数是指仅能被1和自身整除的正整数。我们需要从1到9999之间找出所有的素数并分别保存到三个文件中。 我们可以使用两层循环来实现这个目标。外层循环遍历1到9999之间的每一个数,内层循环用来判断该数是否为素数。具体步骤如下: 1. 创建一个空的a.txt文件用于保存1-99之间的素数。 2. 创建一个空的b.txt文件用于保存100-999之间的素数。 3. 创建一个空的c.txt文件用于保存1000-9999之间的素数。 4. 从1到99之间遍历每一个数: - 判断该数是否为素数: - 若该数为素数,将其写入a.txt文件中,每个素数一行。 - 若该数不是素数,继续下一个数。 5. 从100到999之间遍历每一个数: - 判断该数是否为素数: - 若该数为素数,将其写入b.txt文件中,每个素数一行。 - 若该数不是素数,继续下一个数。 6. 从1000到9999之间遍历每一个数: - 判断该数是否为素数: - 若该数为素数,将其写入c.txt文件中,每个素数一行。 - 若该数不是素数,继续下一个数。 7. 循环结束,a.txt、b.txt和c.txt文件分别保存了1-99、100-999和1000-9999之间的素数。 通过这种方法,我们可以将1-9999之间的素数分别写入三个文件中,实现了目的要求。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值