计算 C 中的二项式系数

2023-12-10

我找到了以下代码进行计算nCr,但不明白其背后的逻辑。为什么这段代码有效?

long long combi(int n,int k)
{
    long long ans=1;
    k=k>n-k?n-k:k;
    int j=1;
    for(;j<=k;j++,n--)
    {
        if(n%j==0)
        {
            ans*=n/j;
        }else
        if(ans%j==0)
        {
            ans=ans/j*n;
        }else
        {
            ans=(ans*n)/j;
        }
    }
    return ans;
}

这是一个聪明的代码!

一般来说,它的目的是计算以下公式:

ans = n! / (k!)(n-k)!

它等于:

ans = n(n-1)(n-2) ... (n-k)...1 / k(k-1)...1 * (n-k)(n-k-1) ... 1

明显取消后:

ans = n(n-1)(n-2)..(n-k+1) / k!

现在请注意分子和分母具有相同数量的元素(k 元素)

所以 ans 的计算如下:

ans  = 1 // initially
ans *= n/1
ans *= (n-1)/2
ans *= (n-2)/3
.
.
.
ans *=  (n-k+1)/k

再次查看代码,您会发现:

  1. ans正在乘以n在每次迭代时
  2. n每次迭代时减少 1 (n--)
  3. ans除以j在每次迭代时

这正是发布的代码所做的,现在让我们看看循环中不同条件的含义,提名者从n和分母从 1 到k,所以变量j分配给分母对吗?

1) if(n%j==0)

在每一步如果n/j是(可计算)所以我们首先计算它而不是乘以整体ans,这种做法将结果保持在尽可能小的值。

2) else if(ans%j==0)

如果我们无法计算每一步n/j但实际上可以计算ans/j所以这样说也不错:

ans /= j; //first we divide
ans *= n; //then we multiply

这总是使我们的总体输出尽可能小,对吗?

3) last condition

在每一步,如果我们都无法计算n/j nor ans/j在这种情况下,我们不够幸运,不能先除然后乘(因此保持结果很小)。但我们还是需要继续前进——尽管我们只剩下一个选择:

ans *= n; // multiply first
ans /= j; // then divide

瞧瞧!

Example考虑这个案例3C7我们知道答案是 7!/ 3!*4! 因此 :ans = 7*6*5 / 1*2*3

让我们看看每次迭代会发生什么:

//1 
ans = 1

//2 
n = 7
j = 1
ans = ans * n/j 
first compute 7/1 = 7
then multiply to ans
ans = 1*7
ans = 7

//3
n = 6
j = 2
ans = ans* n/j

evaluate n/j = 6/2 (can be divided)
         n/j = 3
ans = ans *(n/j)
    = 7 * 3
    = 21

// 4
n = 5
j = 3

ans = ans * n/j
evaluate n/j = 5/3 oppsss!! (first if)
evaluate ans/j = 21/3 = 7 YES (second if)

ans = (ans/j)*n
    = 7*5
    = 35

// end iterations

请注意,在最后一次迭代中,如果我们直接计算,我们会说:

ans = ans*n/j
    = 21 * 5 / 3
    = 105 / 3
    = 34 

是的,它确实找到了正确的结果,但同时该值飞升至 105,然后又回到 35。现在想象一下计算真正的大数?!

结论该代码仔细计算二项式系数,试图在计算的每一步中保持输出尽可能小,它通过检查是否可以除以(int)然后执行,因此它能够计算一些非常大的kCn直接编码无法处理(可能会发生溢出)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 C 中的二项式系数 的相关文章

  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 是否需要销毁运算符删除的形式才能真正销毁对象?

    C 20 添加了破坏形式operator delete区别于std destroying delete t范围 它导致delete表达式在调用之前不再销毁对象operator delete 目的是在显式调用对象的析构函数和释放内存之前 允许
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • 如何修复 Android Studio 中的“组织导入”以进行静态导入

    我正在使用 Android Studio 0 3 7 版本 并且正在尝试 OpenGL ES 编程 这需要从 android opengl GLES20 等类中进行大量导入 例如 不是自动导入 GLES20 并访问 GL COMPILE S
  • FB.getLoginStatus 不起作用?

    由于某种原因 FB getLoginStatus 函数对我不起作用 尽管它曾经工作过一段时间 下面是非常基本的代码 并且警报永远不会弹出 看起来 FB getLoginStatus 永远不会调用提供的函数 有任何想法吗
  • 如何在没有 Maven 和 Docker 的情况下在 Jenkins 声明性管道中执行 SonarQube 扫描器

    SonarQube 扫描仪是否支持 BlueOcean 管道插件 无需 maven 和 docker 如果支持 脚本在 Jenkinsfile 中如何工作 我是 Jenkins 和 BlueOcean 的新手 并且已经尝试了所有可用的基本可
  • WordPress 中的动态简码和函数

    我在基于数据库条目自动生成短代码方面遇到了一些问题 我能够使正常的简码工作 即 function route sc5 return div Route 5 div add shortcode route 5 route sc 和以下激活它的
  • OpenCV Android Studio模块导入问题

    我正在尝试将 OpenCV 导入到 android studio 项目 但 下一步 和 完成 按钮处于非活动状态 所以我无法完成 OpenCV 导入 使用Android Studio Arctic Fox 2020 3 1并尝试了不同版本的
  • 在背景中开始和停止音乐

    我正在制作一个游戏 里面有背景音乐 我想添加一个启动和停止音乐的静音按钮 但我不知道该怎么做 创作音乐的方法是 public static void backgroundMusic try AudioInputStream audio Au
  • PHP 解析错误:语法错误,意外的 T_OBJECT_OPERATOR

    我在调试代码时遇到此错误 PHP 解析错误 语法错误 order php 第 72 行出现意外的 T OBJECT OPERATOR 以下是代码片段 从第 72 行开始 purchaseOrder new PurchaseOrderFact
  • Excel csv 文件中的字符串 (123)

    我正在创建 csv 文件以导入 Excel 有些值是字符串 123 我需要它们显示为 123 Excel 将它们显示为 123 我可以将哪些字符添加到 123 以使 Excel 将它们显示为 123 而无需导入后手动格式化 尝试过双引号 没
  • 如何传递 jenkins 的凭据以将 docker 映像推送到我自己的注册表?

    JHipster 现在使用 maven jib plugin 在此之前 我在 docker container 中运行的 jenkins 服务器能够使用 war 文件构建 docker 映像 并使用 Jenkinsfile 对于 gradl
  • ServiceStack 上的 Html5 Pushstate 网址

    目前 我们在 ServiceStack 根目录中使用 default cshtml 视图来为我们的 AngularJS 单页应用程序提供服务 我想做的是启用对 html5 Pushstate 的支持 因此 URL 中没有哈希值 但到目前为止
  • 如何在 React Native 项目中重新生成 ios 文件夹?

    所以不久前我删除了我的 React Native 应用程序中的 ios 目录 我们称之为 X 我一直在使用 android 模拟器进行开发和测试 但现在我想确保它可以在 ios 上使用 xcode 模拟器等运行 所以我当前的想法是使用 io
  • org.apache.commons.compress.archivers.zip.ZipFile$1 类的 flink InputStream 未实现 InputStreamStatistics

    我试图将 Excel 加载到 Flink 程序中的 POI 工作簿中 有这样的错误 引起原因 java lang IllegalArgumentException 类org apache commons compress archivers
  • Firefox 无法在 iframe 中加载本地文件

    我有一个文件 文件 C Users 7 20Legged 20Spider Desktop test html 当我将它设置到 iframe 中时 iframe 是空白的 为什么会这样以及如何修复它 这是因为安全问题 你无论如何都无法绕过它
  • Android 类未找到异常

    我的一个应用程序遇到问题 我想知道是否有人可以让我深入了解可能导致该问题的原因 我得到了类未找到异常 下面重要的一行是 E AndroidRuntime 21982 Caused by java lang ClassNotFoundExce
  • 在R中,如何根据列表自动绘图?

    我有两个产品类别的调查结果 这是数据 surveyresults lt data frame Name c Adam John Gender c m m City c Sydney Melbourne Product c Fashion E
  • PHPcurl 错误:“连接到...时出现未知的 SSL 协议错误”

    我在 PHP 卷曲方面遇到了极大的困难 我正在尝试打开一个网站 https www novaprostaffing com np index jsp通过 PHP curl 但它不断产生以下错误 连接到 www novaprostaffing
  • 从接收器/服务打开屏幕

    我希望我的应用程序能够打开屏幕并显示我的应用程序 假设我正在设置闹钟 并且每小时我希望我的应用程序在设备自然休眠之前显示 2 分钟 我发现 WakeLock FULL LOCK 和 KeyguardManager 已被弃用 我创建了一个 W
  • 单击菜单链接即可从一个 div 移动到另一个 div

    我想在我的网站上制作动画效果 当我们单击菜单链接 例如 关于部分 时 它将以视差样式为该 div 制作动画 所以 如果你们知道任何 jquery 插件可以在这方面帮助我 那么请告诉我 如果你们也向我展示一个例子 那就更好了 请参阅代码寻求帮
  • 如何在 tkinter ttk 中获得无边框效果?

    为了在 tkinter tk 中获得按钮无边框效果 我曾经设置过borderwidth 0 按钮将合并到背景中 但我无法在 tkinter ttk 中获得相同的效果 我设置borderwidth 0很有型 按钮始终有边框宽度 我不知道为什么
  • 计算 C 中的二项式系数

    我找到了以下代码进行计算nCr 但不明白其背后的逻辑 为什么这段代码有效 long long combi int n int k long long ans 1 k k gt n k n k k int j 1 for j lt k j n