递归之整数划分

1266阅读 0评论2012-04-30 glinuxi
分类:C/C++

将整数划分成为多个整数相加。
例如:6=5+1
           6=4+2
           6=4+1+1
           6=3+3
           6=3+2+1
           6=3+1+1+1
           6=2+2+2
           6=2+2+1+1
           6=2+1+1+1+1
           6=1+1+1+1+1+1

localhuafen.h

  1. # ifndef _LOCAL_HUAFEN_H_
  2.  # define _LOACL_HUAFEN_H_

  3. #define TRUE 1
  4. #define FALSE 0

  5. int panduan(char *, int);
  6. void HuaFen(int, char *);
  7. void show(char *, int);
  8. # endif

huafen.c

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #include"local_huafen.h"
  5. int total=0;

  6. void show(char *ans,int total)
  7. {
  8.     int len = strlen(ans)-1;
  9.     int index=0;

  10.     printf("%d = ",total);

  11.     for( ;index < len; index++)
  12.         printf("%d + ",ans[index]-'0');
  13.     printf("%d\n",ans[index]-'0');
  14. }
  15. int panduan(char *ans ,int len)
  16. {
  17.     int index = 0;

  18.     if(len<1)
  19.         return FALSE;
  20.     for( ; index< len-1 ;index++)
  21.         if(ans[index] < ans[index+1])
  22.             return FALSE;
  23.     return TRUE;
  24. }
  25. void HuaFen(int to,char *ans)
  26. {
  27.     static count ;
  28.     int in = to;
  29.     if(to>=1) {
  30.         for( ; in >=1; in--){
  31.             ans[count++] = in+'0';
  32.             if(panduan(ans,count)==TRUE)
  33.                  HuaFen(to-in,ans);
  34.             ans[--count] = 0;
  35.         }
  36.      } else
  37.         show(ans,total);

  38. }
  39. int main()
  40. {
  41.     char * ans=NULL;
  42.    
  43.     printf("please input the intger:");
  44.     scanf("%d",&total);
  45.     if(total >0) {
  46.         ans = malloc((total+1) * sizeof *ans);
  47.         HuaFen(total,ans);
  48.         free(ans);
  49.     } else
  50.         printf("please input zheng zheng shu!!!\n");
  51.     ans = NULL;
  52.     return 0;
  53. }
结果:


输入小于或等于0的数:

上一篇:C 标准库 error.h
下一篇:递归之组合---代码