C大调帕斯卡三角形

2023-11-30

我是一名计算机工程专业的学生,​​下学期我将开始 C 课程。因此,为了让自己做好一点准备,我开始自学 C 语言,并偶然发现了一个有趣的任务,乍一看,它是为我设计的,不是一个非常高级的水平。

任务是编写一个程序来计算给定位置的值帕斯卡三角形。计算它的公式写为元素=行! / ( 位置!* (行 - 位置)! )

我编写了一个简单的控制台程序,似乎工作正常,直到我开始测试它large数字。

当在第 16 行和位置 3 上尝试这个程序时,它计算出的值为 0,尽管很明显不可能存在这样的值(实际上它应该计算出值为 560),但该三角形的所有单元都应该是整数并且大于一。

我想我遇到了问题存储和处理大数。阶乘函数似乎工作正常,并且我使用的公式一直有效,直到我开始尝试大数

到目前为止,最好的解决方案在这里找到 -如何打印一个 unsigned long long int (unsigned long long int 的格式说明符)?使用 uint64_t 类型的 inttypes.h 库,但它仍然没有给我需要的结果。

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

void clear_input(void);
uint64_t factorial(int x);

int main()
{
    // Printing
    printf("This program computes the value of a given position in Pascal's Triangle.\n");
    printf("You will be asked for row and position of the value.\n");
    printf("Note that the rows and positions starts from 0.\n");
    printf("\n");
    printf("     1          * 0 \n");
    printf("    1 1         * 1 \n");
    printf("   1 2 1        * 2 \n");
    printf("  1 3 3 1       * 3 \n");
    printf(" 1 4 6 4 1      * 4 \n");
    printf(" ****************   \n");
    printf(" 0 1 2 3 4          \n");
    printf("\n");

    // Initializing
    int row, pos;

    // Input Row
    printf("Enter the row: ");
    scanf("%d", &row);
    clear_input();

    // Input Position
    printf("Enter the position in the row: ");
    scanf("%d", &pos);
    clear_input();

    // Initializing
    uint64_t element, element_1, element_2, element_3, element_4;

    // Previously written as -> element = ( factorial(row) ) / ( factorial(pos) * factorial(row - pos) );
    // Doesn't fix the problem
    element_1 = factorial(row);
    element_2 = factorial(pos);
    element_3 = factorial(row - pos);
    element_4 = element_2 * element_3;

    element = element_1 / element_4;

    // Print result
    printf("\n");
    printf("%"PRIu64"\n", element_1);   // Temporary output
    printf("%"PRIu64"\n", element_2);   // Temporary output
    printf("%"PRIu64"\n", element_3);   // Temporary output
    printf("%"PRIu64"\n", element_4);   // Temporary output
    printf("\n");
    printf("The element is %"PRIu64"", element);
    printf("\n");

    return 0;
}

void clear_input(void)                                          // Temporary function to clean input from the keyboard
{
  while(getchar() != '\n');
}

uint64_t factorial(int x)                                       // Function to calculate factorial
{
    int f = 1, i = x;
    if (x == 0) {
        return 1;
    }
    while (i != 1) {
        f = f * i;
        i = i - 1;
    }
    return f;
}

阶乘得到真的很大真的很快(向下滚动一点以查看列表)。即使是 64 位数字也只能达到20!。所以在开始乘法之前你必须做一些预处理。

总体思路是对分子和分母进行因式分解,并删除所有公因数。由于帕斯卡三角形的结果始终是整数,因此可以保证在删除所有公因数后分母将为 1。

例如,假设你有row=35 and position=10。那么计算就是

element = 35! / (10! * 25!)

which is

35 * 34 * 33 * ... * 26 * 25 * 24 * ... * 3 * 2 * 1
---------------------------------------------------
     10!                * 25 * 24 * ... * 3 * 2 * 1   

因此,第一个简化是分母中较大的阶乘抵消了分子中所有较小的项。哪一片叶子

35 * 34 * 33 * ... * 26 
-----------------------
 10 * 9 * 8 * ... * 1     

现在我们需要删除分子和分母中剩余的公因数。它有助于将分子的所有数字放入数组中。然后,对于分母中的每个数字,计算最大公约数(gcd) 并将分子和分母除以 gcd。

以下代码演示了该技术。

array[10] = { 35, 34, 33, 32, 31, 30, 29, 28, 27, 26 };  

for ( d = 10; d >= 2; d-- )
{ 
    temp = d;
    for ( i = 0; i < 10 && temp > 1; i++ )
    {
        common = gcd( array[i], temp );
        array[i] /= common;
        temp /= common;
    }
}

这是代码逐步执行的操作

d=10   i=0   temp=10   array[0]=35  ==>  gcd(35,10)=5, so array[0]=35/5=7  and temp=10/5=2
d=10   i=1   temp=2    array[1]=34  ==>  gcd(34, 2)=2, so array[1]=34/2=17 and temp=2/2=1
inner loop breaks because temp==1
d=9    i=0   temp=9    array[0]=7   ==>  gcd(7,9)=1,  so nothing changes
d=9    i=1   temp=9    array[1]=17  ==>  gcd(17,9)=1, so nothing changes
d=9    i=2   temp=9    array[2]=33  ==>  gcd(33,9)=3, so array[2]=11 and temp=3
d=9    i=3                          ==>  gcd(32,3)=1
d=9    i=4                          ==>  gcd(31,3)=1
d=9    i=5   temp=3    array[5]=30  ==>  gcd(30,3)=3, so array[5]=10 and temp=1
inner loop breaks

当一切都说完并完成后,数组最终为

array[10] = { 1, 17, 11, 1, 31, 1, 29,  14, 3, 26 }

将这些数字相乘,答案是183579396,并且整个计算可以使用 32 位整数来执行。一般来说,只要答案适合32位,就可以用32位进行计算。

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

C大调帕斯卡三角形 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • 如何解决使用 Flask 在 Heroku 上部署模型后导致的应用程序错误?

    该应用程序在本地计算机上完美运行 但部署到 Heroku 后 当我尝试在浏览器中打开该应用程序时 出现应用程序错误 检查日志文件并自己解决了一些小问题 但我现在无法进一步进行 我在部署之前做了什么 点安装gunicorn pip freez
  • 无法在git终端中运行python? [复制]

    这个问题在这里已经有答案了 我在 Win7 系统上安装了 python 3 6 并试图让它在 git bash MINGW64 中工作 到目前为止没有成功 我已将安装目录 当然不是 exe 添加到 PATH 中 但没有结果 即使我直接cd到
  • 如何在 CLI 中获取 ec2 实例状态?

    我可以通过以下方式查看我的实例 aws ec2 describe instances output text RESERVATIONS 193693970645 r 06e25c9702ca1a586 INSTANCES 0 x86 64
  • ForceNetwork 未显示,未返回代码错误

    我正在创建一个 networkD3 forceNetwork 但是在我清除 RStudio 中的环境变量后 当我第二次运行代码时 网络将不会显示在我的浏览器中 知道为什么吗 没有代码错误 变量输出如下 library networkD3 l
  • 在工作表单元格中格式化电话号码

    我正在使用谷歌表格 并希望将美国电话号码转换为以下格式 1xxxyyyzzzz 例如 402 333 4444 应变成 14023334444 我有一个应用程序脚本验证器函数 它可以执行以下操作 var numbers INVALID if
  • NewtonSoft JSON.NET 升级未隐式序列化受保护成员

    我刚刚将 NewtonSoft JSON NET 版本从版本 3 0 0 更新到 3 5 0 我注意到受保护的成员没有隐式序列化 我有以下课程 public class SimpleFileContainer IDto public vir
  • 从 Google Web App 中的 doPost() 重定向,带有应用程序脚本的 HTML 表单

    假设我有一个包含各种输入的 HTML 文件 根据这些输入 我想发送一封电子邮件 然后显示感谢消息或重定向到感谢页面 我正在 doGet 中加载 index html 文件 如下所示 function doGet var template H
  • 如何格式化类似于 Stack Overflow 信誉格式的数字

    我想将数字转换为字符串表示形式 其格式类似于 Stack Overflow 信誉显示 e g 999 999 1000 1 000 9999 9 999 10000 10k 10100 10 1k 另一种方法可以准确产生所需的输出 func
  • ClassNotFoundException 通过 java 的 Servlet 运行 JDBC 时

    当尝试创建 MysqlDataSource 对象时 我遇到了这个奇怪的异常 或者至少我认为这是问题的根源 首先让我准确描述一下我到目前为止所拥有的 我使用 Tomcat7 作为容器 使用 Eclipse 作为 IDE 以便创建一个 JSP
  • 如何创建浅椭圆形 CSS3 阴影

    我知道如何使用 CSS3 阴影 然而我正在尝试实现特定的设计 我希望阴影更亮 并且在左右边缘褪色 请参见附图 我想出的唯一代码如下 但不知道如何使边缘淡出更多 shadow box shadow 0 10px 6px 6px 000000
  • `npm build` 不会运行 package.json 中名为“build”的脚本

    对于我正在尝试使用的新模块npm build无需 gulp Grunt 其他专门的构建工具 scripts build node build js 我的 build js 很简单 console log Hello 然而 运行 npm bu
  • 是否可以在 .exe 中嵌入 bat 文件并将其与 Process 类一起使用?

    我创建了一个与进程一起使用的批处理文件 我目前只有应用程序指向本地计算机上的目录 我不想将我的 exe 与该批处理捆绑在一起 而是想将其作为资源嵌入 以便将其包含在 exe 中 这可以通过批处理文件实现吗 ProcessStartInfo
  • PHP MySql:打印树 - 父子复选框

    我有这个MySql用于放置多个新闻类别 父 子 的表 ID NAME PARENTID DESC 1 LINUX 0 NULL 2 DEBIAN 1 NULL 3 SLAX 1 NULL 4 SLAXLIVE 3 NULL 5 SWFLIV
  • Spark SQL:通过“order by”改善缓存内存占用

    我有两种情况23 GB分区的parquet数据并阅读了一些columns caching它预先触发一系列后续查询 Setup 集群 12 节点 EMR 火花版本 1 6 Spark 配置 默认 运行配置 两种情况相同 Case 1 val
  • 如何在 Swift 中使用下标和上标?

    I want my UILabel to display text in following manner 6 022 1023 What functions does Swift have for subscript and supers
  • 使用 requests 库绕过侵入性 cookie 语句

    我正在尝试使用以下方式抓取网站requests图书馆 但是 我尝试访问的特定网站 http www vi nl matchcenter vandaag shtml 有一个非常侵入性的cookie声明 我尝试按如下方式访问该网站 from b
  • 检测图像是否嵌入

    我开始编写自己的图像主机 但我有一个小问题 如果您通过浏览器直接查看链接 例如 Domain com img 123 我想显示一个 HTML 页面 如果您通过以下方式嵌入链接 我想显示一个图像 img src Domain com img
  • 在 Windows XP 中使用 C# 在登录屏幕上显示窗口

    我正在尝试使用 C 创建一个服务 该服务启动一个可以显示在 Windows XP 登录屏幕上的进程 我发现了一些用 C 执行此操作的代码 C 代码用于创建另一个进程的服务 其中 STARTUPINFO lpDesktop 设置为 WinSt
  • 如何在我的应用程序中列出 iPhone 钥匙串中的证书?

    我正在创建一个 iPhone 应用程序 我们希望在其中使用 x 509 证书进行客户端身份验证 用户可以从电子邮件安装他们的证书 它显示在 设置 gt 常规 gt 配置文件 下 但是我无法从我的应用程序中读取这些证书 我想提供一个类似于 J
  • C大调帕斯卡三角形

    我是一名计算机工程专业的学生 下学期我将开始 C 课程 因此 为了让自己做好一点准备 我开始自学 C 语言 并偶然发现了一个有趣的任务 乍一看 它是为我设计的 不是一个非常高级的水平 任务是编写一个程序来计算给定位置的值帕斯卡三角形 计算它