谁能用C语言帮我解决这个问题(高分悬赏)

来源:百度知道 编辑:UC知道 时间:2024/05/05 10:08:40
n为被除数,k为除数,h为商,余数m=n mod k.显然m<k.如果h<=m,令fun(n,k)为空集.否则,fun(n,k)为满足以下条件的集合:
若m=0,满足n1+n2+...ni≥h,且n1+n2+...+ni-1<h(2≤n1≤h-1, 若i<j,有ni≥nj);
若m≥1,满足n1+n2+...ni≥h+1,且n1+n2+...+ni-1<h+1(2≤n1≤h-1, 若i<j,有ni≥nj),另外还包括{h,1},…{h,m}。
例如,
fun(12,3)={{3,3},{3,2},{3,1},{2,2},{2,1,1}};
fun(13,3)={{3,3},{3,2},{3,1,1},{2,2,2},{2,2,1},{2,1,1,1},{4,1}};
fun(14,3)={{3,3},{3,2},{3,1,1},{2,2,2},{2,2,1},{2,1,1,1},{4,1},{4,2}};

已验证,OK

#include "stdio.h"
#include "stdlib.h"

void main()
{
int n,k,m,h;
int limit;
int *data,top;
int s;
int i,j;
bool firsttime=true;

printf("n=");
scanf("%d",&n);
printf("k=");
scanf("%d",&k);
h=n/k;
m=n%k;
printf("f(%d,%d)={",n,k);

limit=m?h+1:h;

data=(int *)malloc(sizeof(int) * h);
s=data[0]=h;
top=0;

while(1)
{
while(top>=0 && data[top]==1)
{
top--;
s--;
}
if(top==0 && data[top]==2) break;
data[top]--;
s--;
while(s+data[top]<limit)
{
data[top+1]=data[top];
s+=data[top];
top++;
}

for(i=data[top];i+s>=limit;i--)
{
if(!firsttime) putchar(',');
firsttime=false;
putchar('{'