prime factor(模拟枚举)

该C++代码描述了一个程序,输入一个整数n,通过循环和条件判断找到其所有因数,并按从小到大的顺序输出。程序使用了`vll`容器存储因数并进行排序。

Background

给出一个整数n,将n的因数从小到大输出

Description

第一行给出一个整数TMATH:0:(1≤n≤1e12)TMATH:0:(1≤n≤1e12),代表要进行因数分解的的整数

保证

Input

从小到大输出n的因数,每一个n的因数占一行

Sample 1

InputcopyOutputcopy
3
1
2
3
1
1 2
1 3

#include <bits/stdc++.h>
#define endl '\n'
#define buff ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef vector<ll> vll;
typedef vector<pair<ll,ll>> vpll;
const ll MAX_INT=0x3f3f3f3f;
const ll MAX_LL=0x3f3f3f3f3f3f3f3f;
const ll CF=2e5+9;
const ll mod=1e9+7;
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        ll n;
        cin >> n;
        vll factors;
        for(ll i = 1; i * i <= n; ++i)
        {
            if (n % i == 0)
            {
                factors.push_back(i);
                if(i != n / i)
                {
                    factors.push_back(n / i);
                }
            }
        }
        sort(factors.begin(), factors.end());
        for(int i = 0; i < factors.size(); ++i)
        {
            cout << factors[i];
            if(i != factors.size() - 1)
            {
                cout << " ";
            }
        }
        cout << endl;
    }
}

#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> int cmp(const void *a, const void *b) { return *(int*)a - *(int*)b; } // 素数判断(复用) int is_primes(int b) { if (b < 2) return 0; if (b == 2 || b == 3) return 1; if (b % 2 == 0 || b % 3 == 0) return 0; int sqrt_b = sqrt(b); for (int i = 5; i <= sqrt_b; i += 6) { if (b % i == 0 || b % (i + 2) == 0) return 0; } return 1; } // 分解d的所有不同素因子,并更新factor_count void get_prime_factors(int d, int *factor_count) { if (d < 2) return; // 差值为0或1,无素因子 // 分解2的因子 if (d % 2 == 0) { factor_count[2]++; while (d % 2 == 0) d /= 2; // 去重,只计一次 } // 分解奇数因子(6k±1) for (int i = 3; i * i <= d; i += 2) { if (d % i == 0) { factor_count[i]++; while (d % i == 0) d /= i; // 去重 } } // 若剩余d是素数(大于2) if (d > 2) { factor_count[d]++; } } // 生成去重差值,并收集所有素因子的计数 int magic(int n, int *dight, int *number, int *max_d, int *factor_count) { int count = 0; int temp[1000000]; int temp_count = 0; *max_d = 0; // 收集所有差值并找最大差值 for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int diff = abs(number[i] - number[j]); temp[temp_count++] = diff; if (diff > *max_d) *max_d = diff; } } // 排序去重 qsort(temp, temp_count, sizeof(int), cmp); for (int i = 0; i < temp_count; i++) { if (i == 0 || temp[i] != temp[i - 1]) { dight[count++] = temp[i]; // 分解当前差值的素因子,更新计数 get_prime_factors(temp[i], factor_count); } } return count; } int main() { int T; scanf("%d", &T); while (T--) { int n; scanf("%d", &n); int number[n]; for (int i = 0; i < n; i++) { scanf("%d", &number[i]); } if (n <= 2) { printf("2\n"); continue; } int max = n * (n - 1) / 2; int dight[max]; int max_d; // 初始化因子计数数组(大小为最大可能差值+1) int *factor_count = (int*)calloc(max_d + 1, sizeof(int)); // 初始为0 // 生成差值并统计素因子计数(magic函数内部会更新factor_count) int count = magic(n, dight, number, &max_d, factor_count); // 重新分配factor_count大小(避免初始max_d=0导致的内存不足) factor_count = (int*)realloc(factor_count, (max_d + 1) * sizeof(int)); memset(factor_count, 0, (max_d + 1) * sizeof(int)); // 重置为0 // 重新统计(因max_d已确定,确保数组足够大) count = magic(n, dight, number, &max_d, factor_count); // 查找最小符合条件的素数sz int found = 0; // 先检查sz=2 if (factor_count[2] <= 1) { printf("2\n"); found = 1; } else { // 枚举奇数素数,上限为max_d for (int sz = 3; sz <= max_d; sz += 2) { if (!is_primes(sz)) continue; if (factor_count[sz] <= 1) { printf("%d\n", sz); found = 1; break; } } } // 若max_d以内无符合条件的素数,返回max_d后的第一个素数 if (!found) { int sz = max_d + 1; if (sz % 2 == 0) sz++; while (1) { if (is_primes(sz)) { printf("%d\n", sz); break; } sz += 2; } } free(factor_count); // 释放内存 } return 0; }优化这个代码
11-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值