反字典序输出整数所有分割方式

来源是《C语言名题精选百则》

算法思想是:

(1)每次从数中抽取一个残留数sum。如果结尾不是1,sum为1,如果结尾是1,sum是所有1的和加1.

(2)抽取sum后原来的数变成size。再用size去分sum。

(3)sum%size作为最后一个数。

/* ------------------------------------------------------ */
/* PROGRAM  integer partition :                           */
/*    Given a positive integer n, this program lists all  */
/* partition of n in anti-lexical order.                  */
/*                                                        */
/* Copyright Ching-Kuang Shene               July/21/1989 */
/* ------------------------------------------------------ */

#include  <stdio.h>
#include  <stdlib.h>          /* for atoi()               */

#define   MAXSIZE   20

void  display(int[], int[], int);

void  main(void)
{
	int  partition[MAXSIZE + 1]; /* the actuall partition  */
	int  mult[MAXSIZE + 1];      /* multiplicity           */
	int  part_no;              /* no. of parts           */
	int  sum, size, remainder, count;
	int  n;
	char line[100];

	printf("\nPartition of Integer");
	printf("\n====================");
	printf("\n\nInput a Positive Integer --> ");
	gets(line);
	n = atoi(line);
	partition[1] = n;        /* at the biginning, we have*/
	mult[1] = part_no = count = 1; /* only one part.*/
	display(partition, mult, part_no);
	do {                     /* size one sum in 'sum'    */
		sum = (partition[part_no] == 1) ? mult[part_no--] + 1 : 1;
		size = partition[part_no] - 1; /* dec. size     */
		if (mult[part_no] != 1)  /* last part with mul=1*/
			mult[part_no++]--;  /* NO, cut this part   */
		partition[part_no] = size; /* set new part=size */
		mult[part_no] = sum / size + 1; /* fill other*/
		if ((remainder = sum % size) != 0) {
			partition[++part_no] = remainder;
			mult[part_no] = 1;
		}
		count++;
		display(partition, mult, part_no);
	} while (mult[part_no] != n);
	printf("\n\nThere are %d partitions in anti-lexical order",
		count);
	system("pause");
}


/* ------------------------------------------------------ */
/* FUNCTION display :                                     */
/*    This routine displays the given partition.          */
/* ------------------------------------------------------ */

void  display(int partition[], int mult[], int part_no)
{
	int  i, j;

	printf("\n");
	for (i = 1; i <= part_no; i++)      /* for each part */
		for (j = 1; j <= mult[i]; j++) /* and its mult. */
			printf("%3d", partition[i]); /* show them  */
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值