我不知道为什么很多问题很简单但是还是要写很长时间 。。。

来源:互联网 发布:w8卸载软件 编辑:程序博客网 时间:2024/05/14 13:46

比如下面的问题,是求n个元素可以划分为多少个集合。

例如输入3,就一共有{1,2,3},{1,2}{3},{1}{2,3},{1}{2}{3},{1,3}{2}五种分割方式。


源码如下,改了很长时间,注释里面的是我之前的思路。

#include<stdio.h>#include<stdlib.h>#define CARRY 1#define NOCARRY 0int maxArr(int data[],int n){int i;int max = 0;for(i = 0;i < n;i++)if(max < data[i])max = data[i];return max;}void printArr(int data[],int n){int i;for(i = 0;i < n;i++)printf("%d",data[i]);printf("\n");}int main(){int n;int *data;int i,j;int pos;int flag = NOCARRY;int count = 0;scanf("%d",&n);data = (int *)malloc(sizeof(int) * n);for(i = 0;i < n;i++)data[i] = 1;pos = i;while(maxArr(data,n) < n){/*while(data[pos] >= maxArr(data,pos) + 1){pos--;flag = CARRY;}data[pos]++,count++;if(flag == CARRY)for(j = pos;j < n;j++)data[j] = 1;flag = NOCARRY;pos = n - 1;*/while(data[pos] + 1 > maxArr(data,pos) + 1){data[pos] = 1;pos--;}data[pos] ++;count++;//for(j = pos;j < n;j++)//data[j] = 1;pos = n - 1;//printArr(data,n);}printf("count == %d\n",count);return 0;}