码迷,mamicode.com
首页 > 其他好文 > 详细

整数分拆的非递归程序

时间:2014-10-01 01:10:00      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   使用   ar   for   sp   div   art   

 

#include<stdio.h>
void print_partition(int n)
{ int i=1;
  int m=1;
  int h=1;
  int t,r;
  int a[n+1];
  for(;i<n+1;++i)a[i]=1;
  a[1]=n;
  printf("%d\n",a[1]);

  while(a[1]!=1)
       {  if(a[h]==2) {a[h--]--;m++;}
               else { r=--a[h];
                          t=m-h+1;
                         while(t>=r){a[++h]=r;t-=r;}
                         if(t==0)m=h;
                         else m=h+1;
                         if(t>=2) {a[++h]=t;}
                    }
                for(i=1;i<m+1;i++)
                printf("%d ",a[i]);
                printf("\n");
        }
}

int main()
{  int n;
   printf("input the number:\n");
   scanf("%d",&n);
   printf("now output all the partitions of %d:\n",n);
   print_partition(n);
   return 0;
}

  

接下来使用逆字典序打印:

 

#include<stdio.h>

void print_partition_inverse(int n)
{  int a[n+1],i,j,m,h,r;
   for(i=1;i<=n;i++){
         a[i]=1;
         printf("%d ",a[i]);
                     }
   printf("\n");
   a[0]=-1,a[1]=2,h=1,m=n-1;
   for(i=1;i<=m;i++){
         printf("%d ",a[i]);
                   }
   printf("\n");
   while(a[1]!=n){   if  ( m-h>1)
                         { a[++h]=2; m--;}
                   else  { j=m-2;
                           while (a[j]==a[m-1]) a[j--]=1;
                           h=j+1;
                           a[h]=a[m-1]+1;
                           r=a[m]+a[m-1]*(m-h-1);
                           a[m]=1;
                           if (m-h>>1) a[m-1]=1;
                           m=h+r-1;
                         }     
                    for (i=1;i<=m;i++)
                    printf("%d ",a[i]);
                    printf("\n");
                 }
}

int main()
{  int n;
    printf("input the number:\n");
    scanf("%d",&n);
    printf("now output all the partitions of %d:\n",n);
    print_partition_inverse(n);
    return 0;
}

  

最后是只打印固定长度的分拆:

 

#include<stdio.h>

unsigned long int PartOfFixedLength(int n, int k)
{
     if ((n<=0) || (k<=0)) {
          printf("Error: Arguments must be positive integers!\n");
          return 0;        }

     int a[k+2],i;
     a[1]=n-k+1,a[k+1]=0;
     for(i=2; i<=k; ++i) a[i]=1;
     printf("Line 1: ");
     for(i=1; i<=k; ++i)
     printf(" %d ",a[i]);
     printf("\n");
      
     unsigned long int TotalNumbers = 1;
     int s,x,j;
     int n_div_k = n/k;
     int n_mod_k = n%k;
     int q = n_div_k + ((n_mod_k == 0)?0:1);
     while (a[1]!=q) {
            j=2;
            s=a[1]-1;
            while(a[j]>=a[1]-1)
                  s+=a[j++];
            if (j<=k)  { 
                x=++a[j--];
                while(j>1) {
                      a[j--]=x;
                      s-=x;}
                a[1]=s;
                       }

           TotalNumbers++;
           printf("Line %lu: ",TotalNumbers);
           for(i=1;i<=k;i++)
           printf(" %d ",a[i]);
           printf("\n");
                     }
     return TotalNumbers;           
}            

  

 

整数分拆的非递归程序

标签:blog   io   os   使用   ar   for   sp   div   art   

原文地址:http://www.cnblogs.com/xida/p/4002787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!