博客
关于我
7-14 整数分解为若干项之和 (15分)(附详细讲解(不用递归的高效算法))
阅读量:804 次
发布时间:2019-03-25

本文共 2058 字,大约阅读时间需要 6 分钟。

针对正整数N分解为多个正整数之和的问题,我们需要列举所有可能的分解方法,并按照递增顺序输出。这种分解方法可以采用递归的策略,每次从分解结果中找到一个可以合并的最右边部分,从而逐步简化问题。

针对输入的N=7,分解的思路是:

  • 首先生成一个全由1组成的数组,长度等于N本身;
  • 然后通过不断地合并相邻的部分,直到数组长度再减少为止;
  • 每次合并可以有两种选择:靠近右边的数字是否可以合并,或者需要进行递归调整以保持递增顺序。
  • 通过这种方式,我们可以得到所有可能的分解式子。

    改进后的算法直接在代码中处理分解过程,而不是通过递归调用,从而提高运行效率。这种方法尤其适用于较大的N值(如60及以上),性能提升显著。

    改进后的代码如下:

    #include 
    int main(void) { int n, i, len, origin, count, temp; int leap = 1; int a[30] = {0}; scanf("%d", &n); len = n; origin = len; for (i = 0; i < len; ++i) a[i] = 1; for(;;) { up: if (leap != 1) { printf("; "); printf("%d = ", n); for (i = 0; i < len; ++i) if(i == 0) printf("%d", a[i]); else printf("+%d", a[i]); ++count; if (count == 4) { printf("\n"); count = 0; } } if (a[0] == n) break; if (a[len-1] - a[len-2] <= 4) { ++a[len-2]; if (a[0] == n) goto up; --a[len-1]; temp = a[len-1]; for (i = len-1; i < origin; ++i) { if ((temp - a[len-2]) < a[len-2] && (temp - a[len-2]) != 0) { a[i] = a[len-2]; len = i + 1; temp -= a[len-2]; goto up; } } if (temp == 0) { if (a[len-1] == a[len-2] || (a[len-1] - a[len-2] == 1)) { a[len-2] += a[len-1]; --len; goto up; } if (a[0] > n) goto end; } else { a[len-1] -= 1; a[len-2] += 1; if (a[0] > n) goto end; } } else { a[len-1] -= 1; a[len-2] += 1; if (a[0] > n) goto end; } } end: return 0;}

    这种改进的算法直接在循环体内处理分解过程,减少了函数调用开销,显著提升了性能,特别是对于较大的N(如60及以上),效率提升明显。

    转载地址:http://rtnyk.baihongyu.com/

    你可能感兴趣的文章
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>
    MySQL
    查看>>
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>