c - 如何在快速运行时获得总的非素数?
问题描述
我在一个竞争激烈的编程网站上学习 C。问题是,给定一个数字,这个数字有多少个非质因数?我可以用我的代码来做到这一点:
#include <stdio.h>
int totalNPF(int n){
int totalFactor = 1, temp = 0, primeFactor = 0;
for(int i=2; n!=1;){
while(n % i == 0){
n /= i;
temp++;
}
if(temp != 0){
totalFactor *= (temp+1);
primeFactor ++;
}
i++;
temp = 0;
}
return totalFactor-primeFactor;
}
int main(){
int T, n;
scanf("%d", &T);
for(int i=0; i<T; i++){
scanf("%d", &n);
printf("%d\n", totalNPF(n));
}
return 0;
}
我使用数论概念,但它仍然很慢。它的运行时间超过 1 秒。有谁知道如何提高速度,以便我可以将速度提高到 1 秒或以下?
注意:数字的限制是 2x10^6
解决方案
for(int i=2; n!=1;){
更改为可以使程序更快for(int i=2; i*i <= n;){
。n
一旦小于当前候选因子的平方,这将终止对因子的搜索。在这一点之后,除了n
自身之外,不能有任何素因数,因为如果j
素因数大于i
,那么n/j
将是小于 的因数i
。但是这样一个因素会n
在循环的早期提取出来。
由于这意味着循环可能会n
以主要因素退出,因此需要在循环后插入一些代码来测试是否n
大于 1,如果是,则totalFactor
进行primeFactor
相应的调整。
通过仅测试素数作为候选因子而不是测试从 2 开始的每个整数,也可以使程序更快。请注意,由于程序需要支持最多 2,000,000 的数字,并且新循环将在 的平方根处停止,因此n
只需要最多 1,414 个素数。这样的素数列表可以很容易地预先准备好。
推荐阅读
- mysql - 更新子查询错误你不能指定目标表
- linux - 无法使用 debuginfo-install 安装
- java - iconImages 不工作:线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException
- python - 尝试使用输入创建 txt 文件时,它不起作用
- android - 如何启动超过 16 个 CPU 的 Android 模拟器
- json - 基于Spring的rest服务返回html而不是json
- android - 如何使用 okhttp 和内容 URI 在 Android 11 中将文件上传到服务器?(PDF,docx..)
- node.js - 使用比例约束最大化网络流量
- swift - swift中的Karatsuba乘法
- java - 获取斐波那契数的总和的代码