埃及分数c语言设计,埃及分数(四)

article/2025/10/14 22:51:25

最优分解

源程序

下面就是求埃及分数最优分解的 C 语言源程序 EgyptianFraction.c:

1: #include

2: #include

3: #include

4:

5: const int SIZE = 64;

6: static int wp = -1, bp = -1;

7: static mpz_t z, w, work[SIZE], best[SIZE];

8: static mpq_t q1, q2;

9:

10: void fail(int code) { printf("***FAIL(%d)***\n", code); exit(code); }

11: void push(const mpz_t v) { if (wp > SIZE-2) fail(1); mpz_set(work[++wp], v); }

12: void pop() { if (wp < 0) fail(2); --wp; }

13: void copy() { bp = wp; for (int i = 0; i <= wp; i++) mpz_set(best[i], work[i]); }

14:

15: void sum(mpz_t sum, const mpz_t stack[], int sp)

16: {

17: mpz_set_si(sum, 0);

18: for (int i = 0; i <= sp; i++) mpz_add(sum, sum, stack[i]);

19: }

20:

21: void search(int depth, const mpq_t q, const mpz_t start)

22: {

23: if (depth == 0) fail(3);

24: mpz_t n; mpz_init(n); mpq_t q3; mpq_init(q3);

25: mpz_cdiv_q(n, mpq_denref(q), mpq_numref(q));

26: if (mpz_cmp(start, n) > 0) mpz_set(n, start);

27: while (1) {

28: mpq_set_den(q1, n);

29: int cmp = mpq_cmp(q, q1);

30: if (cmp > 0) {

31: mpq_set_si(q2, depth, 1); mpq_set_den(q2, n); mpq_canonicalize(q2);

32: if (mpq_cmp(q, q2) >= 0) break;

33: push(n);

34: mpz_add_ui(n, n, 1);

35: mpq_sub(q3, q, q1);

36: search(depth - 1, q3, n);

37: pop();

38: } else if (cmp == 0) {

39: push(n);

40: if (bp == -1) copy();

41: else {

42: cmp = mpz_cmp(best[bp], work[wp]);

43: if (cmp > 0) copy();

44: else if (cmp == 0) {

45: sum(z, best, bp); sum(w, work, wp);

46: if (mpz_cmp(z, w) > 0) copy();

47: }

48: }

49: pop();

50: break;

51: } else fail(4);

52: }

53: mpz_clear(n); mpq_clear(q3);

54: }

55:

56: int main(int argc, char *argv[])

57: {

58: if (argc != 3) {

59: puts("Usage: EgyptianFraction Numerator Denominator");

60: return 1;

61: }

62: mpz_t start; mpq_t q;

63: mpz_inits(start, z, w, 0);

64: mpz_set_str(z, argv[1], 10);

65: mpz_set_str(w, argv[2], 10);

66: mpq_inits(q, q1, q2, 0);

67: mpq_set_num(q, z);

68: mpq_set_den(q, w);

69: mpq_canonicalize(q);

70: if (mpq_sgn(q) <= 0) fail(5);

71: for (int i = 0; i < SIZE; i++) mpz_inits(work[i], best[i], 0);

72: gmp_printf("%Qd:", q); fflush(stdout);

73: mpq_set_si(q1, 1, 1);

74: mpz_set_si(start, 2);

75: for (int items = 1; bp == -1; items++) {

76: bp = -1;

77: search(items, q, start);

78: }

79: for (int i = 0; i <= bp; i++) gmp_printf(" %Zd", best[i]);

80: printf("\n");

81: for (int i = 0; i < SIZE; i++) mpz_clears(work[i], best[i], 0);

82: mpz_clears(start, z, w, 0);

83: mpq_clears(q, q1, q2, 0);

84: return 0;

85: }

编译和运行

编译:

$ clang -o EgyptianFraction EgyptianFraction.c -lgmp

运行:

$ ./EgyptianFraction

Usage: EgyptianFraction Numerator Denominator

$ ./EgyptianFraction 101 414

101/414: 6 18 46

$ time ./EgyptianFraction 732 733

732/733: 2 3 7 45 7330 20524 26388

real 7m8.216s

user 6m56.107s

sys 0m0.137s

源程序分析

这个源程序基本原理和上一篇“埃及分数(三)”中的 EgyptianFixItem.c 是一样的。 不同之处在于:

main 函数中,第 75 至 78 行的循环,从假设展开式只有一项开始,逐渐增加展开式的项数,调用 search 函数进行深度优先搜索。

search 函数中,第 38 至 50 行找到一个展开式后,将其和最优分解 best 比较,如果更优则替换之。

注意,不用比较 work 和 best 的项数是否相同,此时 wp 必定等于 bp。

ea50144b41c880b18cd326d14401f3a3.png


http://chatgpt.dhexx.cn/article/vhu2IEMK.shtml

相关文章

埃及分数问题

问题描述: 古埃及人喜欢用最少的分子为 1 的真分数来表示一个真分数&#xff0c;比如7 / 8 1 / 2 1 / 3 1 / 24 。设计程序把一个真分数表示为最少的埃及分数之和的形式。 思路&#xff1a; 首先要知道什么是真分数&#xff1a;真分数是指大于0小于1的所有分数。这些分数的特…

贪心算法之埃及分数问题

1.问题&#xff1a;给定一个分数&#xff0c;如7/8&#xff0c;我们可以把它表示为1/2 1/3 1/24&#xff0c;埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式&#xff0c;输入一个真分数把其分解为埃及分数之和。 2.设计思路&#xff1a;设分数为a/b,则cb/a,db%a,…

【数模】相关性分析

相关性&#xff1a;如果一个变量的变化引起了另一个变量的变化 目录 一、四种基本变量 二、 相关性分析方法 1.Pearson相关系数 2.Spearman 等级相关系数 3.Kendall tua-b 等级相关系数 4.卡方检测 5.Eta系数 *SPSS操作 三、偏相关 1.SPSS操作 2.偏相关系数和检验&…

数学建模-相关性分析及热力图

目录 一、相关性分析 二、相关性分析实例 三、三种相关系数 3.1 Pearson线性相关系数 3.2 Kendall tau系数 3.3 Spearman相关系数 4、Matlab代码 4.1 Pearson 显著性检验 4.2 Pearson 相关系数矩阵 4.3 Kendalltau相关系数矩阵 4.4 Spearman相关系数矩阵 5、代码…

R语言基础——简单相关性分析(1)

简单相关性分析&#xff08;1&#xff09; 简介1. 协方差和相关系数1.1 协方差1.2 相关系数 2. 相关性分析参考 简介 初次接触相关性分析&#xff0c;在摸索中前进&#xff0c;也顺便将笔记记录下来&#xff0c;未雨绸缪嘛&#xff01; 简单来说&#xff0c;相关性分析就是衡量…

分类变量、有序变量与数值变量相关性分析方法总结及 R 语言应用

文章目录 一、分类 & 分类相关性分析二、有序 & 有序相关性分析三、数值 & 数值相关性分析四、分类 & 有序相关性分析五、分类 & 数值相关性分析六、有序 & 数值相关性分析 本文全部假设显著性水平为0.05&#xff0c;特殊说明的除外。 一、分类 & …

数据分析方法和思维—相关性分析法

01 写在前面 在数据分析的问题中, 经常会遇见的一种问题就是相关的问题, 比如抖音短视频的产品经理经常要来问留存&#xff08;是否留下来&#xff09;和观看时长, 收藏的次数, 转发的次数, 关注的抖音博主数等等是否有相关性, 相关性有多大。 因为只有知道了哪些因素和留存比较…

python相关性分析_python实践统计学中的三大相关性系数,并绘制相关性分析的热力图...

本文首发地址&#xff1a; https://yishuihancheng.blog.csdn.net/article/details/83547648 欢迎关注我的博客【Together_CZ】&#xff0c;我是沂水寒城&#xff01; 今天我简单地使用了scipy模块进行了统计学中三大相关性分析方法&#xff08;皮尔森相关性系数、斯皮尔曼相…

数据相关性分析笔记

一、数据相关性的含义 数据类型 数据可以是连续的值&#xff0c;比如声音、图像&#xff0c;称为模拟数据。也可以是离散的&#xff0c;如符号、文字&#xff0c;称为数字数据。(ppt)数值型数据、分类型数据、定序数据。 数据相关性 数据相关性是指数据之间存在某种关系&#…

ArcGIS栅格数据图层空间相关性分析方法

ArcGIS栅格数据图层空间相关性分析方法 也不知道严谨不严谨&#xff0c;先Mark吧欸。 矢量的空间相关分析可以通过Spatial Join以后&#xff0c;导出属性表到EXCEL中&#xff0c;进行相关分析Correlation Analysis.  而两个栅格数据图层直接能不能直接在ArcMap中进行相关分…

IBM SPSS Statistics常用的相关性分析方法

灵活运用IBM SPSS Statistics做数据的统计和分析是每个数据分析师都应该掌握的技能&#xff0c;这款软件为用户提供了全面的数据分析方法&#xff0c;可以解决我们在数据分析过程中遇到的各种难题。 接下来小编就为大家介绍一下SPSS相关性分析的方法。 图1&#xff1a;SPSS软件…

神经网络相关性分析方法,神经网络相关性分析图

1、bp神经网络怎么确定输入与输出是正相关还是负相关&#xff1f; 想了解输入输出关系你可以求协方差&#xff0c;进而求peason相关系数 当然你也可以求spearman 等&#xff0c;看他们的相关度即可&#xff0c;正负就代表是正相关还是负相关&#xff0c;具体值代表相关性度量 …

重剑无锋!15种相关分析算法,总有一款适合你!

相关系数&#xff08;Correlation coefficient&#xff09;可用于评估两个变量之间的线性关系&#xff0c;它的值在-1到1之间&#xff0c;-1或1代表完美的负相关和正相关&#xff0c;0表示不存在线性关系。 计算相关系数的方法种类繁多&#xff0c;各有自己的定义以及适用情况…

Keil MDK5中对结构体变量使用结构体成员运算符.后不自动显示结构体成员

MDK5在对结构体变量使用结构体成员运算符.时是会显示结构体成员的&#xff0c;如图所示&#xff1a; 但是有时候使用结构体成员运算符.时并不会出现结构体成员&#xff0c;导致这个问题的原因是没有将自己写的文件添加到工程之中&#xff0c;解决办法如下&#xff1a; 检查是…

【C语言】结构体的创建和使用与结构体内存对齐

结构体创建 前言结构体的声明全局声明特殊声明 结构体变量定义与成员初始化成员类型变量定义匿名结构体变量定义 结构体的自引用结构体成员的访问成员初始化操作符结构体传参 结构体内存对齐对齐数对齐规则 前言 在生活中我们要描述一个人时是不是要知道他的名字、性别、年龄啊…

C语言struct结构体内存

对齐规则&#xff1a; &#xff08;i&#xff09;结构体内 成员存储位置 的起始地址为成员自身长度与默认对齐值 中的较小者的整倍数。 &#xff08;ii&#xff09;结构体A嵌套在结构体B内&#xff0c;则A在B内存储位置起始地址为 A内成员最长长度 的整数倍。 &#xff08;iii&…

嵌入式系统开发:C语言中的位结构体

在嵌入式开发中&#xff0c;经常需要表示各种系统状态&#xff0c;位结构体的出现大大方便了我们&#xff0c;尤其是在进行一些硬件层操作和数据通信时。但是在使用位结构体的过程中&#xff0c;是否深入思考一下它的相关属性&#xff1f;是否真正用到它的便利性&#xff0c;来…

keil中,编写结构体成员运算符(.)后不能自动弹出结构体成员

keil中&#xff0c;编写结构体成员运算符&#xff08;.&#xff09;后不能自动弹出结构体成员 解决办法&#xff1a; 1、确保源文件里面包含sys.h/stm32f10x.h文件&#xff08;或者源文件里面的头文件也行&#xff09; 2、把源文件路径加载到keil里面&#xff08;魔术棒->C/…

c++中的结构体案例

结构体案例一 案例描述&#xff1a;学生做毕设项目&#xff0c;每名老师有5个学生&#xff0c;总共有3个老师&#xff0c;需求如下&#xff1a; 设计学生和老师的结构体&#xff0c;在老师的结构体中&#xff0c;有老师的姓名和一个存放了5名学生的数组作为成员学生的成员有姓…

C语言:位结构体

位结构体是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构体比按位运算符更加方便。 一、位结构—简介 有些信息在存储时&#xff0c;并不需要占用一个完整的字节&#xff0c; 而只需占几个或一个二进制位。 例如在存放一个开关量时&#xff0c;只有0和1 两种状…