zoukankan      html  css  js  c++  java
  • 将一个整数划分为非负整数的部分

    比如,4=1+1+1+1=1+1+2=1+2+1=1+3=2+1+1=2+2=3+1=4

    总共有8种方法,一般的,证书n有2n-1种划分方法,可以设计一种方法,按照字典序将所有的划分方法都输出来。

    其中的思路为,给定一个n,使用一个长度为n的数组,初始化每个元素为1,每次将低位的元素分出一个元素出来,加到相邻的高位上面。

     1 void part(int n, int* as, void (*fn)(int,int*))
     2 {
     3         int j;
     4         int i;
     5         for(j=0;j<n;j++)
     6                 as[j]=1;
     7         j=n-1;
     8 repeat:
     9         fn(j+1,as);
    10         if(j == 0) return;
    11         as[j-1]++;
    12         j--;
    13         if(as[j+1] > 1)
    14         {
    15                 i=as[j+1]-1;
    16                 as[j+1]=1;
    17                 j+=i;
    18         }
    19         goto repeat;
    20 }


    测试的例子当n=6的时候的结果为

    1 1 1 1 1 1
    1 1 1 1 2
    1 1 1 2 1
    1 1 1 3
    1 1 2 1 1
    1 1 2 2
    1 1 3 1
    1 1 4
    1 2 1 1 1
    1 2 1 2
    1 2 2 1
    1 2 3
    1 3 1 1
    1 3 2
    1 4 1
    1 5
    2 1 1 1 1
    2 1 1 2
    2 1 2 1
    2 1 3
    2 2 1 1
    2 2 2
    2 3 1
    2 4
    3 1 1 1
    3 1 2
    3 2 1
    3 3
    4 1 1
    4 2
    5 1
    6

  • 相关阅读:
    实验 6 数组1输出最大值和它所对应的下标
    实验5第二题
    实验5第一题
    作业 3 应用分支与循环结构解决问题 判断是否闰年
    心得与体会1
    第七章
    第六章
    第五章
    第四章
    第一章
  • 原文地址:https://www.cnblogs.com/mathlover/p/2745309.html
Copyright © 2011-2022 走看看