问题是在C ++中将数字n作为其主要因子的乘积
例如14 = 2 * 7
24 = 2 * 2 * 2 * 3
5 = 5。
我的代码是:
#include <iostream>
#include <cmath>
using namespace std;
bool prime(int n)
{
for (int i=2;i<=sqrt(n);i++)
{
if (n%i==0) return false;
}
if (prime) return true;
}
int main ()
{
int n;
int k=0,a[10000]={0};
cin>>n;
while (n!=1)
{
for (int i=2;;)
{
if (n%i==0 && prime(i)) {n/=i; a[k]=i;k++; }
else i++;
if (n==1) break;
}
}
cout<<a[0];
int s=1;
while (a[s]!=0)
{
for (s=1;;s++)
{
if (a[s]==0) break;
cout<<"*"<<a[s];
}
}
return 0;
}
但问题是时间限制,compiler_stderr.txt向我显示了这条消息:
solver.cpp: In function `bool prime(int)':
solver.cpp:11: warning: the address of `bool prime(int)', will always evaluate as `true'
当我输入2147483647时,它会再次显示这个数字,但是在5或6秒后
答案 0 :(得分:2)
关于这一行的警告:
if (prime) return true;
这不调用函数,它只是测试函数指针的值。因为它不是空指针,所以它总是正确的。
如果你在函数中达到了这一点,那么除数的测试都没有成功,所以你应该只返回true
而不进行任何测试。
你的程序返回答案需要这么长时间的原因是因为你使用了一种低效的方法来测试质数。您应该只使用Sieve of Eratosthenes测试其他素数。此外,您应该在循环之前只调用sqrt(n)
一次,并将其值保存在变量中;计算平方根是很昂贵的,所以你不想每次都这样做。
答案 1 :(得分:0)
我不认为您应该在返回之前检查prime
是否已定义。
请尝试以下
bool prime(int n)
{
for (int i=2;i<=sqrt(n);i++)
{
if (n%i==0) return false;
}
return true;
}
答案 2 :(得分:0)
阅读警告信息。请记住,编译器有一个原因,并没有为了好玩而发出警告。一旦你这样做,你很容易发现错误:
if (prime)
prime是函数的名称。在许多情况下,函数的名称会自动转换为函数的地址。在if语句中,检查控制表达式是零还是非零。函数prime的地址永远不是空指针,所以&#34; if&#34;表达式将始终评估为true。
答案 3 :(得分:0)
当前代码不需要素数函数。只是反复检查(n%i)== 0将消除素数的任何幂,因为它将继续将i加入k []直到不再有i的因子。假设4是n的因子,那么当i达到4时,它将不是因子,因为当i为2时,它已经被n / = i分割,(k [0] = 2,k [1] = 2)。 k []将以n的素因子结束,而不需要素数函数。
答案 4 :(得分:0)
prime
的地址为never zero,因此始终会返回true
。所以该计划将完美地运作。虽然您可能希望以更易读的方式编写它:return true;
并删除条件检查。2147483647
是一个非常大的数字,你的程序运行时间为O(n ^ 1.5)。因此,您可以假设它按2147483647^1.5
次的顺序运行。因此输出的时间延迟。您可以尝试使用其他方法(如this。