国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C趣味編程百例(32)

2019-11-17 05:40:33
字體:
來源:轉載
供稿:網友

96.選美比賽
97.滿足特異條件的數列
98.八皇后問題



96.選美比賽
   在選美大獎賽的半決勝賽現場,有一批選手參加比賽,比賽的規則是最后得分越高,名次越低。當半決決賽結束時,要在現場按照選手的出場順序公布最后得分和最后名次,獲得相同分數的選手具有相同的名次,名次連續編號,不用考慮同名次的選手人數。例如:
   選手序號:         1,2,3,4,5,6,7
   選手得分:         5,3,4,7,3,5,6
   則輸出名次為:     3,1,2,5,1,3,4
   請編程幫助大獎賽組委會完成半決賽的評分和排名工作。
*問題分析與算法設計
   問題用程序設計語言加以表達的話,即為:將數組A中的整數從小到大進行連續編號,要求不改變數組中元素的順序,且相同的整數要具有相同的編號。
   普通的排序方法均要改變數組元素原來的順序,顯然不能滿足要求。為此,引入一個專門存放名次的數組,再采用通常的算法:在尚未排出名次的元素中找出最小值,并對具有相同值的元素進行處理,重復這一過程,直到全部元素排好為止。
*程序與程序注釋
#include<stdio.h>
#define NUM 7       /*定義要處理的人數*/
int a[NUM+1]={0,5,3,4,7,3,5,6};       /*為簡單直接定義選手的分數*/
int m[NUM+1],l[NUM+1];    /*m:已編名次的標記數組   l:記錄同名次元素的下標*/
void main()
{
   int i,smallest,num,k,j;
   num=1;                       /*名次*/
   for(i=1;i<=NUM;i++)       /*控制掃描整個數組,每次處理一個名次*/
      if(m[i]==0)     /*若尚未進行名次處理(即找到第一個尚未處理的元素)*/
      {
         smallest=a[i];     /*取第一個未處理的元素作為當前的最小值*/
         k=1;            /*數組l的下標,同名次的人數*/
         l[k]=i;        /*記錄分值為smallest的同名次元素的下標*/
         for(j=i+1;j<=NUM;j++)   /*從下一個元素開始對余下的元素進行處理*/
            if(m[j]==0)            /*若為尚未進行處理的元素*/
               if(a[j]<smallest)    /*分數小于當前最小值*/
               {
                  smallest=a[j];    /*則重新設置當覵最小值*/
                  k=0;              /*重新設置同名次人數*/
                  l[++k]=j;         /*重新記錄同名次元素下標*/
               }
               else if(a[j]==smallest)     /*若與當前最低分相同*/
                  l[++k]=j;               /*記錄同名次的元素下標*/
         for(j=1;j<=k;j++)       /*對同名次的元素進行名次處理*/
            m[l[j>=num;
         num++;                  /*名次加1*/
         i=0;          /*控制重新開始,找下一個沒排名次的元素*/
   }
      for(j=1;j<=NUM;j++)                 /*控制輸出*/
      printf(" %3d      %4d      %4d/n",j,a[j],m[j]);
}

*運行結果
         Player-No         Score         Rank
            1                5             3
            2                3             1
            3                4             2
            5                7             5
            5                3             1
            3                5             3
            7                6             4

*思考題
   若將原題中的“名次連續編號,不用考慮同名次的選手人數”,改為”根據同名次的選手人數對選手的名次進行編號“,那么應該怎樣修改程序。


97.滿足特異條件的數列
   輸入m和n(20>=m>=n>0)求出滿足以下方程的正整數數列 i1,i2,...,in,使得:i1+i1+...+in=m,且i1>=i2...>=in。例如:
   當n=4, m=8時,將得到如下5 個數列:
         5 1 1 1      4 2 1 1      3 3 1 1      3 2 2 1      2 2 2 2
*問題分析與算法設計
   可將原題抽象為:將M分解為N個整數,且N個整數的和為M,i1>=i2>=...>=in。分解整數的方法很低多,由于題目中有"i1>=i2>=.....>=in,提示我們可先確定最右邊in元素的值為1,然后按照條件使前一個元素的值一定大于等于當前元素的值,不斷地向前推就可以解決問題。下面的程序答應用戶選定M和N,輸出滿足條件的所有數列。
*程序與程序注釋
#include<stdio.h>
#define NUM 10      /*答應分解的最大元素數量*/
int i[NUM];    


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑水县| 洞头县| 张家口市| 水城县| 三门县| 青浦区| 武鸣县| 雷波县| 格尔木市| 隆回县| 乌审旗| 左云县| 雷州市| 黔西| 宿松县| 聊城市| 肃宁县| 扶余县| 珠海市| 察哈| 漳平市| 雷波县| 菏泽市| 邳州市| 闸北区| 喀什市| 康定县| 滨州市| 游戏| 陆丰市| 电白县| 博客| 班戈县| 甘泉县| 陈巴尔虎旗| 五寨县| 金溪县| 于都县| 信丰县| 漾濞| 兴山县|