我被要求对一个数字进行分解并以特定的方式显示它。
例如:100 = 2 ^ 2 * 5 ^ 2
这是我到目前为止使用的C ++代码,不幸的是:
#include <stdio.h>
#include <math.h>
//IsPrime indicates whether a given number is or is not prime.
bool IsPrime(long long n)
{
int j = 3;
if (n == 2)
{
return true;
}
else if (n % 2 == 0)
{
return false;
}
else
{
for (j = 3; j <= sqrt(n); j += 2)
{
if (n%j == 0)
{
return false;
}
}
}
return true;
}
int main(void)
{
long long n_orig,n, i=3 , primecount=0;
scanf("%lld", &n_orig);
n = n_orig;
if (n == 1)
{
printf("1");
return 0;
}
if (IsPrime(n))
{
printf("%lld", n);
return 0;
}
if (n % 2 == 0)
{
while (n >= 2 && n % 2 == 0)
{
primecount++;
n = n / 2;
}
if (primecount == 1)
{
printf("2*");
}
else
{
printf("2^%lld*", primecount);
}
}
primecount = 0;
n = n_orig;
while (i <= n/2)
{
if (IsPrime(i))
{
while (n >= i && n % i == 0)
{
primecount++;
n = n / i;
}
}
n = n_orig;
if (primecount == 0)
{
i++;
continue;
}
if (primecount == 1)
{
printf("%lld*", i);
}
else
{
printf("%lld^%lld*", i, primecount);
}
primecount = 0;
i+=2;
}
printf("\b");
return 0;
}
使用此代码,我能够生成一些测试用例,但是当我将答案上传到可能评估代码的网站时,在7个测试用例中(我不知道它们到底是什么),在一个案例中,我通过了3 ,失败3 和超过了时间限制(在问题中没有宣布的那个)。我真的很感激一些帮助,请对诺贝尔友好!
另外,我真的不想知道我的答案是否可以通过某种方式得到改善,我现在的首要任务就是理解为什么我自己的代码没有按预期工作。
P.S:不允许使用 iostream 和数组。
提前致谢。
答案 0 :(得分:1)
试试这个:
#include <stdio.h>
#include <math.h>
unsigned long long PrintMultiplicity(unsigned long long n,unsigned long long factor)
{
unsigned int count = 0;
while (n%factor == 0)
{
count++;
n /= factor;
}
if (count > 0)
{
printf("%llu^%u",factor,count);
if (n > 1)
printf("*");
}
return n;
}
void PrintFactorization(unsigned long long n)
{
unsigned long long factor;
unsigned int add;
printf("%llu = ",n);
n = PrintMultiplicity(n,2);
n = PrintMultiplicity(n,3);
// Check only factors that are adjacent to multiples of 6
for (factor = 5, add = 2; factor <= sqrt(n); factor += add, add = 6-add)
n = PrintMultiplicity(n,factor);
if (n > 1)
printf("%llu^1",n);
printf("\n");
}
int main()
{
unsigned long long n;
scanf("%llu",&n);
PrintFactorization(n);
return 0;
}
答案 1 :(得分:0)
您需要执行一些优化的优化。不要为每个值调用isPrime()
方法,而是考虑一种不同的方法,以便在一开始就可以完全忽略不相关的值。
n
下的相关素数列表。从列表中的最低素数值开始,将n
除以中间值为
n / lowest_prime_that_perfectly_divide_n
。
通过检查下一个更高的素数值继续执行此操作,直到n
变为1
。这样,每个分割因子都会计算。
答案 2 :(得分:0)
您不需要进行主要测试,只有加速才需要素数或主轮列表。列出所有主要因素的简单程序是
#include <stdio.h>
#include <math.h>
int main(void)
{
long long n_orig,n,k;
scanf("%lld", &n_orig);
n = n_orig;
k=2;
while(k*k<=n) {
while(0==n%k) {
n = n/k;
printf("%lld ",k);
}
k++;
}
if(n>1) printf("%lld ",n);
printf("\n");
return 0;
}
这不会生成所需的输出格式,但可以轻松添加到其中。