如图,程序要求使用递归算法将组合数的各种可能性按照格式输出,目前我已经做到了这一步:
以下为源代码:
请问如何才能按照格式输出,也就是将每一行都右对齐呢?
#include "stdafx.h"
void combinations(int n,int r,int i)
{
static int n0=n,r0=r;
int i1;
for(i1=i;i1<=n0-r+1;i1++){
printf("%d ",i1);
if(r-1>0)
combinations(n-1,r-1,i1+1);
else printf("\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n,r,i=1;
printf("ENTER N R:");
scanf_s("%d%d",&n,&r);
printf("combinations:\n");
combinations(n,r,i);
return 0;
}
#include "stdlib.h"
#include "string.h"
#define MAX 20
void combinations(char * prefix, int start, int n, int remain)
{
if (remain == 0)
{
printf("%s\n", prefix);
return;
}
for (int i = start; i <= n - remain + 1; i++)
{
char temp[5];
sprintf(temp, "%d ", i);
if (i != start)
memset(prefix, ' ', sizeof(char) * strlen(prefix));
char * acc = (char *)malloc(MAX * sizeof(char));
acc[0] = '\0';
strcat(acc, prefix);
strcat(acc, temp);
combinations(acc, i + 1, n, remain - 1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n,r,i=1;
printf("ENTER N R:");
scanf_s("%d%d",&n,&r);
printf("combinations:\n");
char seed[MAX];
seed[0] = '\0';
combinations(seed, 1, n, r);
return 0;
}
vs2013+,需要把sprint、strcat、strlen等换成带 _s的版本,这个你自己去做了。
#include "stdafx.h"
void combinations(int n,int r,int i)
{
static int n0=n,r0=r,flag=0;
int i1,j;
for(i1=i;i1<=n0-r+1;i1++){
if(flag==1){
for(j=0;j<r0-r;j++)
printf(" ");
flag=0;
}
printf("%d ",i1);
if(r-1>0)
combinations(n-1,r-1,i1+1);
else{
printf("\n");
flag=1;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n,r,i=1;
printf("ENTER N R:");
scanf_s("%d%d",&n,&r);
printf("combinations:\n");
combinations(n,r,i);
return 0;
}
贴一个自己的答案以备参考,可能更好理解也可能更难理解