关于计算n的合数?

dongyi940333 2007-10-26 09:55:02


/*****************************************************************************
计算的合数,一个整数n可以有多种划分,使其划分的一列整数之和为n,例如,6的分划为:
6
5 1
4 2
.
.
.
1 1 1 1 1 1
共11种,这种分划的程序如下:

这是软考程序设计的一道习题,要求补全代码(程序中打问号的地方,填入一行代码).

我想了一天也想不出来,请各位大侠指点一下这个程序的思路.谢谢
*****************************************************************************/
#include<stdio.h>



int n[1000] = { 0 };

int m = 0;

int k = 0;



void output_sum()
{
int j = 0;



for( j = 0; n[j] != 0; j++ )

{

printf("%3d", n[ j ] );

printf("\n");

}

}




void sum( int i )
{

if( m - n[ i ] <= n[ i ] )

{

//??

i++;

n[ i + 1 ] = 0;

}

else

{

//??

//??

i++;

}



if( m != n[ i ] )

{

//??

}
else

{

output_sum();

}



if( n[ i ] > 1 )

{

//??

//??

}

else

{

while( ( n[ i ] == 1 ) && ( i > 0 ) )

{

i--;

m += n[ i ];

}



if( i != 0 )

{

//???

//???

}

}

}



int main()
{

int i = 0;

int j = 0;



scanf( "%d", &n[ 0 ] );

m = k = n[ 0 ];



for( i = 1; i <= k; i++ )

{

n[ i ] = 0;

}



while( n[ 0 ] != 1 )

{

n[ 0 ] --;

i = 0;

sum(0);

m = k;

}

}





...全文
214 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zkbuchaladi 2007-11-02
  • 打赏
  • 举报
回复
study
dongyi940333 2007-10-31
  • 打赏
  • 举报
回复
一楼的用递归算法比书上的好!

谢谢各位,祝各位身体健康,万事如意!!!!
bigc2000 2007-10-30
  • 打赏
  • 举报
回复
我把某算法教材上面的算法说一下:
递归,但是需要使用memoziation

PartitionsI_C(num,d)
if(num<=1) or max_digit = 1
return 1
if(d>num) d = num;

if <num,max_digit> in cache
return cache(<num,max_digit>)

res = 0
for i=d downto 1
res += PartitionsI_C(num-i,i)
cache(<num,max_digit>) = res;
return res


PartitionS_C(n)
return PartitionsI_C(n,n)


当然也可用动态规划,但是状态空间比这个memoziation要大。
dongyi940333 2007-10-27
  • 打赏
  • 举报
回复
谢谢LS两位的帮助,正在看代码,过两天结贴^_^
tailzhou 2007-10-26
  • 打赏
  • 举报
回复
完整的程序代码:

#include <stdio.h>


/*****************************************************************************
计算的合数,一个整数n可以有多种划分,使其划分的一列整数之和为n,例如,6的分划为:
6
5 1
4 2
.
.
.
1 1 1 1 1 1
共11种,这种分划的程序如下:

这是软考程序设计的一道习题,要求补全代码(程序中打问号的地方,填入一行代码).

我想了一天也想不出来,请各位大侠指点一下这个程序的思路.谢谢
*****************************************************************************/
#include<stdio.h>



int n[1000] = { 0 };

int m = 0;

int k = 0;



void output_sum()
{
int j = 0;



for( j = 0; n[j] != 0; j++ )

{

printf("%3d", n[ j ] );



}
printf("\n");

}




void sum( int i )
{

if( m - n[ i ] <= n[ i ] )

{

m=n[i+1]=m - n[ i ]; //??

i++;

n[ i + 1 ] = 0;

}

else

{

m=m-n[i];//??
n[i+1]=n[i];//??

i++;

}



if( m != n[ i ] )

{

sum(i);//??

}
else

{

output_sum();

}



if( n[ i ] > 1 )

{

n[ i ]--;//??

sum(i);//??

}

else

{

while( ( n[ i ] == 1 ) && ( i > 0 ) )

{

i--;

m += n[ i ];

}



if( i != 0 )

{

n[i]--;//???

sum(i);//???

}

}

}



int main()
{

int i = 0;

int j = 0;



scanf( "%d", &n[ 0 ] );

m = k = n[ 0 ];



for( i = 1; i <= k; i++ )

{

n[ i ] = 0;

}



while( n[ 0 ] != 1 )

{

n[ 0 ] --;

i = 0;

sum(0);

m = k;

}

}
tailzhou 2007-10-26
  • 打赏
  • 举报
回复
for( j = 0; n[j] != 0; j++ )

{

printf("%3d", n[ j ] );

printf("\n");

}
应该是:

for( j = 0; n[j] != 0; j++ )

{

printf("%3d", n[ j ] );


}
printf("\n");

不然对不齐的;
dobear_0922 2007-10-26
  • 打赏
  • 举报
回复
/*给你参考一下*/
#include <stdio.h>

int a[100]={0};

void shuchu(int m)
{
int i;
for(i=0;i<=m-1;i++)
printf("%d ",a[i]);
printf("\n");
}

void fenjie(int n,int m)
{
int i;
if(n==0) shuchu(m);
else
for(i=n;i>=1;i--)
if(m==0||i<=a[m-1])
{a[m]=i;fenjie(n-i,m+1);}
}

void main(void)
{
int n,i,m=0;
printf("please input a number(0<n<100): ");
scanf("%d",&n);
fenjie(n,m);
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧