答:因為解決組合問題要用到階乘,計算機系統(tǒng)不可能直接計算較大數(shù)的階乘。如:本機: ULLONG_MAX = 18446744073709551615 為20位數(shù),最大可計算 20! = 2432902008176640000 為19位數(shù),以上是64位計算機、windows7(32位)、gcc10編譯器的情況,所以不可能解決輸入任意多個元素的問題。必須根據(jù)自己的系統(tǒng)來決定最多可以求多少元素的組合問題。
創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為忻州等服務(wù)建站,忻州等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為忻州企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
#include stdio.h
#include string.h#define NUM 3
struct student
{
char name[20]; /*姓名*/
long num; /*12位學(xué)號*/
double sum; /*總分*/
};
void Create_Students(struct student stu[NUM])
{
struct student *p;
printf("請輸入學(xué)生姓名 學(xué)號(12位) 總分:\n");
for( p = stu; p stu+NUM; p++)
{
scanf("%s %d %lf",p-name,p-num,p-sum); }
}
void Order_Students(struct student stu[NUM])//起泡法
{
int i,j;
struct student temp;
for(i=NUM-1;i=0;i--)
for(j=0;ji;j++)
if(stu[j].sumstu[j+1].sum)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1]=temp;
}
}
void main()
{
int i=1;
struct student *p;
struct student stu[NUM];
Create_Students(stu);
Order_Students(stu);
printf("%-20s %-13s %-6s %4s\n","姓名","學(xué)號(12位)","總成績","名次");
for(p=stu;pstu+NUM;p++,i++)
{
printf("%-20s %-13.0d %-8.2f %2d\n",p-name,p-num,p-sum,i);
}
}//你參考參考,嘿
給你一個直接插入排序
#include "stdio.h"
void InsertSort(int a[], int left, int right) {//對數(shù)組a從下標(biāo)為left到right區(qū)域進行直接插入排序
int i, j, tmp;
for(i = left + 1; i = right; i++) {
for(j = i - 1, tmp = a[i]; j = left tmp a[j]; j++)
a[j + 1] = a[j];
a[j + 1] = tmp;
}
}
void main( ) {
int i, n, a[100];
scanf("%d", n);
for(i = 0; i n; i++)
scanf("%d", a[i]);
InsertSort(a, 0, n - 1);
printf("\n");
for(i = 0; i n; i++) printf("%d\t", a[i]);
}
#include?stdio.h
//選擇排序算法,升序
void?sort(int?*arr,int?n)
{
int?i,j,k;
int?tmp;
for(i=0;in-1;i++)
{
k=i;??//開始一趟選擇排序,假定第i個元素是后面n-i+1個未排序的元素中最小的元素
for(j=i+1;jn;j++)
{
if(arr[k]??arr[j])?//如果發(fā)現(xiàn)比當(dāng)前最小元素還小的元素,則更新記錄最小元素的下標(biāo)k
k=j;
}
//如果最小元素的下標(biāo)不是后面n-i+1的未排序序列的第一個元素,則需要交換第i個元素和后面找到的最小元素的位置
if(k?!=?i)
{
tmp=arr[k];
arr[k]=arr[i];
arr[i]=tmp;
}
}
}
int?main()
{
int?a[10]={?-5,-9,-8,3,9,2,-28,101,-395,0};
int?i;
sort(a,10);
for(i=0;i10;i++)
printf("%d?",a[i]);
printf("\n");
return?0;
}
//運行結(jié)果
F:\c_worka.exe
-395?-28?-9?-8?-5?0?2?3?9?101
1、求排列組合沒有簡單方法。方法只有一個,枚舉。有幾個位置需要列舉,就需要幾個循環(huán)。如果循環(huán)數(shù)量太多,可以用函數(shù)遞歸來枚舉。
2、例程:
#includestdio.h
int?main(){
int?a[4]={1,3,4,7};????????//第一個位置
int?b[4]={2,5,8,10};????//第二個位置
int?c[4]={6,9,11,12};????//第三個位置
int?i,j,k;
for(i=0;i4;i++)
for(j=0;j4;j++)
for(k=0;k4;k++)
printf("%d?%d?%d\n,",a[i],b[j],c[k]);//輸出一種排列
getch();
return?0;
}
C語言中,每個函數(shù)都有返回值類型??梢允莢oid,int,double,等,也可以是struct類型。
在返回值是void類型的函數(shù)中,return一般在最后一行,后面不加任何值,而且此時return可以省略。如:
void printResult(int n)
{
printf("%d\n",n);
return;
}
并不是return必須放在最后一行。只要達到這個函數(shù)的目的就能夠返回:
如尋找學(xué)號是200的學(xué)生,如果找到就輸出學(xué)號,找不到就返回的一個函數(shù):
void findStudentByNumber(int n,int sn[],int m)
{//m是學(xué)生總數(shù),n是查找的學(xué)號,sn是個數(shù)組,存放多個學(xué)生學(xué)號;
int i;
for(i=0;i!=m;i++)
if(sn[i]==n)
{
printf("%d",n);
return;//已經(jīng)找到,不需要再找;
}
return;//找遍了,沒找到,此處返回,此處可省略,因為是void返回類型;
}
非void返回類型的函數(shù)返回語句不能省略,并且要返回一個與返回類型相同的值。
如:
int add(int a,int b)
{
return a+b;
}
自定義函數(shù)的方法:VC中,定義函數(shù)分為兩步:
I.聲明:在main函數(shù)開頭定義變量的位置,聲明函數(shù):定義上述函數(shù)聲明是:
int add(int a,int b);
注意分號,聲明前部不能有執(zhí)行語句;
II.把下面的函數(shù)定義部分放在main函數(shù)外部
int add(int a,int b)
{
return a+b;
}
推薦放在main的后花括號后面,注意此處的int add(int a,int b)后面并沒有分號。
VC里面,返回類型是int的函數(shù)可以省略聲明部分