我必须制作一个程序来找到显示n的最大方式!数字(不包括1)。
比如:4!= 1x2x3x4 = 1x2x3x2x2。所以你可以用5个数的乘积来表示4!。所以输入是4,输出是5。5是你能表达4的最大数量!。
简单地说,就是将一个阶乘数分解为素因子,计算出它们的个数并显示出来。
我所做的是一个“for”循环,在这个循环中我计算1到“n”的所有素因子及其数量。
但我对大数字有一个问题,比如当“n”是100000时,需要8秒才能完成。我需要提高速度。
我认为问题在于因式分解函数。
int factors( int fact )
{
int i,cont,product=1, control;
cont=0;
control=fact;
for (i= 2;control != product;)
{
if ((fact%i == 0))
{
cont++;
fact/=i;
product*=i;}
else
i++;
}
return cont;
}
我需要改进它以获得最佳执行时间。或者我用来从阶乘数中获取质因数的方法不是一个好的选择?
注意:我不计算100000的值!我只是将所有数字从1分解到10000并计数。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int *prime;
int prime_n;
void make_prime_table(int n){
prime = malloc(sizeof(int) * n / 2);
prime_n =0;
prime[prime_n++] = 2;
prime[prime_n++] = 3;
int i, j;
for(i = 5; i <= n; i +=2){
bool is_prime = true;
for(j = 1; j < prime_n ; ++j){
int t = prime[j];
if(t * t > i)
break;
if(i % t == 0){
is_prime = false;
break;
}
}
if(is_prime)
prime[prime_n++] = i;
}
}
int factors(int fact_n ){
int i, c, p, sum=0;
for(i = 0; i < prime_n ; ++i){
c = fact_n;//number of prime in N : (x1 = N / P) + (x2 = x1 / P) + ...
while(c = c / prime[i]){
sum += c;
}
}
return sum;
}
int main(void){
int n = 100000;
make_prime_table(n);
int ans = factors(n);
printf("ans = %d\n", ans);
free(prime);
return 0;
}
素数P的N!:
2 in 10的情况!
1 2 3 4 5 6 7 8 9 10
* * * * * # There are 5 number that is divided by 2. 5 = 10 / 2
* * # Number that can be divided further part of the mark of `*`(5/2).
* # The number of total is the number of `*`.
*搜索“勒让德定理”
有时候,能够知道一个计算执行消耗的时间是非常有意义的,尤其是在对比和基准测试中。最简单的一个办法就是在计算开始之前设置一个起始时候,再由计算结束时的结束时间,最后取出它们的差值,就是这个计算所消耗的时间。想要实现这样的做法,可以使用 time 包中的 Now() 和 Sub 函数: start := time.Now() longCalculation() end := time.Now() de
问题内容: 我想通过查看算法的运行时性能来测试哪种数据结构是最佳的,我该怎么做? 例如我已经有一个; 假设我有我的,我想知道下面的语句需要多长时间来执行:。 我该如何计时? 谢谢! 问题答案: 首先看一下我对这个问题的回答;它包含一个可移植的(windows/linux)函数,以毫秒为单位获取时间。 接下来,执行以下操作: 全做完了!(请注意,我没有尝试编译它)
函数的运行时间的长短是衡量这个函数性能的重要指标,特别是在对比和基准测试中,要得到函数的运行时间,最简单的办法就是在函数执行之前设置一个起始时间,并在函数运行结束时获取从起始时间到现在的时间间隔,这个时间间隔就是函数的运行时间。 在Go语言中我们可以使用 time 包中的 Since() 函数来获取函数的运行时间,Go语言官方文档中对 Since() 函数的介绍是这样的。 func Since(t
可能的重复: 如何测量函数的运行时间? 我有一种I/O计时方法,它将数据从一个位置复制到另一个位置。计算执行时间的最佳和最真实的方法是什么<代码>线程<代码>定时器<代码>秒表?还有其他解决方案吗?我想要最准确的,尽可能简短的。
计算一个函数执行的时间。 使用 console.time() 和 console.timeEnd() 来测量开始和结束时间之间的差,以确定回调执行的时间。 const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); ret
问题内容: 如何获得方法的执行时间?是否存在Timer实用程序类,用于对任务花费多长时间进行计时等? Google上的大多数搜索都会返回安排线程和任务的计时器的结果,这不是我想要的。 问题答案: 总有一种老式的方式: