算法题目
算法分析
-
第一种和第二种都是利用三重循环来控制,但是对于输入的任意m,我们就不能通过一个程序来控制所有的循环重数来实现,所以我们想到了递归。
-
第三种的话,可以简单认为是从任意的n个数中挑选m个数,m个数从小到大排列的话,最后一个的范围是从n到m,所以从这个地方开始逐步挑选,挑选完了之后就到了倒数第二个,其是从n-1个选出m-1个,在此基础上再倒数第三个,其是从n-2个选出m-2,依此类推,直到最后只剩下一个数,挑选完毕就开始回溯。
代码实现
- 方法一
#include<stdio.h>
int f(int n,int m)
{
int count=0;
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
if((i<j)&&(j<k))
{
count++;
printf("%d %d %d\n",i,j,k);
}
}
}
}
return count;
}
int main()
{
int n,m,s;
printf("请输入你想从哪n个数中选出哪m个数:\n");
scanf("%d%d",&n,&m);
s=f(n,m);
printf("从%d个数中选出%d个数一共有%d种方法!\n",n,m,s);
return 0;
}
- 方法二
#include<stdio.h>
int f(int n,int m)
{
int count=0;
int i,j,k;
for(i=1;i<=n-m+1;i++)
{
for(j=i+1;j<=n-m+2;j++)
{
for(k=j+1;k<=n-m+3;k++)
{
count++;
printf("%d %d %d\n",i,j,k);
}
}
}
return count;
}
int main()
{
int n,m,s;
printf("请输入你想从哪n个数中选出哪m个数:\n");
scanf("%d%d",&n,&m);
s=f(n,m);
printf("从%d个数中选出%d个数一共有%d种方法!\n",n,m,s);
return 0;
}
- 方法三
#include<stdio.h>
int a[100];
int count=0;
int f(int n,int m)
{
int i,j;
for(i=n;i>=m;i--)
{
a[m]=i;
if(m>1)
{
f(i-1,m-1);
}
else
{
for(j=a[0];j>0;j--)
{
printf("%d ",a[j]);
}
count++;
printf("\n");
}
}
return count;
}
int main()
{
int n,m,s;
printf("请输入你想从哪n个数中选出哪m个数:\n");
scanf("%d%d",&n,&m);
a[0]=m;
s=f(n,m);
printf("从%d个数中选出%d个数一共有%d种方法!\n",n,m,s);
return 0;
}
结果示例
- 示例一
- 示例二
- 示例三