这办法很多,提供一个作参考——
#include "stdio.h"#include <stdlib.h>
#include "time.h"
int main(int argv,char *argc[]){
int a[10],i,j,k
printf("Random 10 Numbers are as follows:\n")
srand((unsigned)time(NULL))
for(i=0i<10i++)
printf("%d ",a[i]=rand())
printf("\n\n5 largest number is as follows:\n")
for(i=0i<5i++){
for(k=i,j=k+1j<10j++)
if(a[k]<a[j])
k=j
if(k-i)
j=a[k],a[k]=a[i],a[i]=j
printf("%d ",a[i])
}
printf("\n\n")
return 0
}
运行结果如下:
我擦,这算法有些复杂,没搞对,弄了一个小时只弄出个全排列的,你看能改改不:#include <stdio.h>
#define NUM 10
int main ()
{
int i, j, k, l, m, n, a[NUM]
n = 0
printf("Enter NUM numbers:\n")
for(i = 0i <NUMi++){
scanf("%d", &a[i])
}
for(i = 0i <NUMi++){
for(j = 0j <NUMj++){
if(i == j){
continue
}
for(k = 0k <NUMk++){
if(k == i || k ==j){
continue
}
for(l = 0l <NUMl++){
if(l == i || l == j || l == k){
continue
}
for(m = 0m <NUMm++){
if(m == i || m == j || m == k || m == l){
continue
}
printf("%d,%d,%d,%d,%d\n", a[i], a[j], a[k], a
[l], a[m])
n++
}
}
}
}
}
printf("Counts:%d\n", n)
return 0
}
这是一个回溯算法的经典例子,可以用下面的函数和程序实现,该程序整体看来主体只用一个循环语句,分为向前试探阶段和向后回溯阶段,需认真理解代码#include <iostream.h>
const int maxn=100
int a[maxn]
void combback(int n,int r)
{
int i=0,j
a[i]=1
do{
if(a[i]-i<=n-r+1) //还可以向前试探
{
if(i==r-1) //已经找到一个组合输出
{
for(j=0j<rj++)
cout<<a[j]<<' '
cout<<endl
a[i]++
continue
}
i++ //向前试探
a[i]=a[i-1]+1
}
else //回溯
{
if(i==0)return //已经找完了所有解
a[--i]++
}
}while(1)
}
void main()
{
combback(10,5)
}