Thế này :
Bạn để ý dòng từ trên xuống dưới , bắt đầu là 1 và kết thúc là chính số đó . Bạn gom nhóm lần lượt từ sau ra phía trước . Dòng đầu tiên luôn là một dãy các số 1 - dĩ nhiên nếu số ban đầu là 0 hay số âm thì phải xét .
Ghi lại ví dụ của bạn nhé :
1. 1+1+1+1
2. 1+1+(1+1) - gom 2 số cuối của dòng 1
3. 1+(1+2) - 2 số cuối của dòng 2
4. 2+2 - Do dòng 3 chỉ có 2 số nên không thể gom 2 số cuối ( gom xong thành 4 mất rồi còn đâu ) , nên phải tăng số 1 đầu tiên lên 1 đơn vị
5. 4 - tương tự như dòng 4 ( nhưng do khi tăng 2 lên thành 3 thì nó bị trùng 3+1=1+3 ở trên nên loại )
have fun
Bài bạn yêu cầu đây!!
#include <conio.h>
#include <stdio.h>
int sum(int a[],int n)
{ int s=0;
for(int i=0;i<n;i++)
{
s+=a[i];
}
return(s);
}
int t;
void addnum(int a[],int n,int num)
{
for(int j=1;j<=a[n-1];j++)
{
a[n]=j;
int s = sum(a,n);
if(s==num)
{
printf("\n %d = ",t);
for(int i=0;i<n;i++)
{
printf("%d",a[i]);
if(i<n-1)
{
printf("+");
}
}
break;
}
if(s<num)
{
n++;
addnum(a,n,num);
n--;
}
if(s>num)
{
break;
}
}
}
void analyzer(int num)
{
int a[100];
int n=0;
a[n++]=1;
while (a[0]<=num)
{
addnum(a,n,num);
a[0]++;
}
}
void main()
{
int num;
k:printf("\nNhap mot so bat ky: n= ");scanf("%d",&num);
if(num<1)
{
printf("\nKhong duoc choi xo nhau nha! De nghi nhap lai!!!");
goto k;
}
else
t=num;
analyzer(num);
getch();
}