k可以从N项目检索的项目组合的数量由以下公式描述.
N!
c = ___________________
(k! * (N - k)!)
Run Code Online (Sandbox Code Playgroud)
一个例子是6 Balls可以从48 Balls彩票抽奖的鼓中抽取多少组合.
优化此公式以使用最小的O时间复杂度运行
这个问题的灵感来自新的WolframAlpha数学引擎,以及它可以非常快速地计算出非常大的组合.例如,随后在另一个论坛上讨论该主题.
http://www97.wolframalpha.com/input/?i=20000000+Choose+15000000
在一些人对解决方案进行了尝试之后,我会发布一些来自该讨论的信息/链接.
任何语言都可以接受.
language-agnostic performance combinations binomial-coefficients
我正在尝试构建一个多项式函数生成器,因此它将一个向量(任意大小)作为参数,并生成一个我稍后可以使用的多项式函数.
例如,
poly_gen(vector<int> power_index)
Run Code Online (Sandbox Code Playgroud)
以(我可以用另一个函数调用)的形式返回一个函数(或通过其他方法)
y(k)=a0+ a1*n+ a2*n^2 + a3*n^3 + ... + ak*n^k
Run Code Online (Sandbox Code Playgroud)
其中a0,a1 .... ak存储在vector-power_index中
后来我可以用它来调用它
int calc_poly(int n)
Run Code Online (Sandbox Code Playgroud)
这calc_poly可以返回一个数字,通过使用由生成的多项式表达式计算poly_gen()
PS:我不知道如何通过关键词搜索这个问题.功能,构造,发电机,指针,仿函数...没有给我想要的结果.
谢谢你们!
目前,我的最大努力导致了复杂度O(log [n] ^ 2):
int power(x,n)
{
int mult=1, temp=x, i=1, j=1;
while (n>1)
{
mult=mult*x;
x=temp;
for (i=1;i<=log[n];i++)
{
x=x*x;
j=j*2;
}
n=n-j;
i=1;
j=1;
}
if (n==1)
return (mult*temp);
return (mult);
}
Run Code Online (Sandbox Code Playgroud)
PS谢谢你funkymushroom帮助我的英语不好:)
我有一个非常有趣的问题.最近我发现,Math.pow()只接受(double,double)args,我想知道为什么没有其他类型组合的重载函数,如(int,int)或(int,double)atc ......
我认为这是一个很大的漏洞,并且很多弱点,所以我相信有一个原因.有人可以向我解释一下吗?
考虑这两种方法:
private int simplePow(int x) {
return x * x;
}
private int harderPow(int x) {
return (int) Math.pow(x, 2);
}
Run Code Online (Sandbox Code Playgroud)
第一个比第二个快得多...问题是,如果你知道,你使用幂(int,int),计算是非常有效的,你不需要处理双变量的问题.
我一直收到这个错误:
'Math'未声明首次使用此功能
虽然我包括了数学库.
int x = Math.pow(10.0,(double)k);
Run Code Online (Sandbox Code Playgroud)
这是我得到错误的行,任何想法为什么?
如果下面的代码有问题,有人可以告诉我吗...在一个问题中,我被问到以下斐波纳契数函数是否有问题.
int fib(int n)
{
if (n <= 1) return n;
return fib (n-1) + fib(n-2);
}
Run Code Online (Sandbox Code Playgroud)
其中n是0 ... 100
所以我的回答是什么,因为我看不到任何明显的东西.语法似乎很好,逻辑上这是计算斐波那契数.我在做出这个假设时是否正确?
这是我获取 2 根的代码
#include <stdio.h>
unsigned long long root(int n);
int main()
{
int n,i;
unsigned long long c;
n=10;
for(i=1;i<=n;i++)
{
c=root(i);
printf("%d decimal digits:%llu\n",i,c);
}
return 0;
}
unsigned long long root(int n)
{ unsigned long long int m,d;
d=pow(10,n);
m=2*pow(10,2*n);
while (pow(d,2)<=m)
{
d++;
}
return d-1;
}
Run Code Online (Sandbox Code Playgroud)
Unsigned long long int 可以支持从 0 到 $2^64-1$。我认为这足以计算 10 位小数。
我希望 10 位十进制的输出应该是14142135623
问题陈述:
给定base和n均为1或更大,计算base的值为n次幂,因此powerN(3, 2)为9(3的平方).
例
powerN(3, 1) ? 3
powerN(3, 2) ? 9
powerN(3, 3) ? 27
Run Code Online (Sandbox Code Playgroud)
功能签名是 public int powerN(int base, int n)
我发现难以解决这个问题?帮帮我.
编辑:我需要一个不使用内置数学公式和递归的解决方案
我的 while 循环在 10_000 上工作正常,但在 100_000 上加载需要时间,并且在 10_000_000 上不起作用。
我不明白为什么,它是一台机器,无论数字多少,它都应该很快。所以我认为我的代码中有一个错误,但对我来说,一切看起来都很好。
Console.WriteLine(SumSequenceElements(10_000_000));
static double SumSequenceElements(int n)
{
int i = 1;
double sum = 0;
while (i <= n)
{
int j = 0;
double power = 1;
while (j < i + 1)
{
power *= -1;
j++;
}
sum += power / (i * (i + 1));
i++;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud) 当我使用该pow()功能时,有时结果是一个.例如,这段代码产生124,但我知道5³应该是125.
#include<stdio.h>
#include<math.h>
int main(){
int i = pow(5, 3);
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
为什么结果错了?
c ×3
math ×3
c++ ×2
java ×2
pow ×2
algorithm ×1
big-o ×1
c# ×1
calculation ×1
class ×1
combinations ×1
expression ×1
function ×1
functor ×1
overloading ×1
performance ×1
sequence ×1
sum ×1
while-loop ×1