已给出x
和k
,其中x
是数A
的因子数,k
是A
的素数数。给定x
和k
,我必须找出是否存在这样的A
。
例如:
INPUT : 4 2
OUTPUT : 1
由于6是具有4个因数1、2、3、6的数,其中2是质数(2,3)。还假定x
和k
可以具有1到10 9之间的任何值。
这是我的代码:
long long int x, k; scanf("%lld%lld", &x, &k); int ans = 0; bool stop = false; for (long long int numbers = 1; numbers < pow(10, 9) && !stop; numbers++) { long long int noOfFactors = 0, noOfPrimes = 0; for (long long int a = 1; a <= numbers && !stop; a++) { if (numbers % a == 0) { noOfFactors += 1; if ((isprime(a)) == 1) { noOfPrimes += 1; } } } if (noOfFactors == x && noOfPrimes == k) { ans = 1; stop = true; } else ans = 0; } printf("%d\n", ans);
如果x为质数,则
isprime(x)
返回1,否则为0。
但是在运行程序时,它显示TLE错误。谁能帮助我优化该算法,或者如果存在其他方法,您可以向我解释一下吗?在优化此算法或使用其他方法方面的任何帮助将不胜感激。
我有x和k,其中x是数A的因数,k是A素数的数。给定x和k,我必须找出这样的A是否存在。例如:INPUT:...
让p
for (long long int numbers = 1; numbers < pow(10, 9) && !stop; numbers++)
pow
将在每次迭代中不必要地被调用。将每个常量保存到循环之前的变量中。但是在这种情况下,只需使用numbers < 1e9
1000000000
代替pow(10, 9)
。可以比您更早地停止内循环:仅在a * a < numbers
时运行内循环,并为每个匹配项添加2个除数。如果a * a == numbers
,则添加另一个除数。
noOfFactors > x
或noOfPrimes > k
时也停止内循环。