天天看點

藍橋舊題_賭城玩牌問題與加法換乘法問題

問題:小明被劫持到X賭城,被迫與其他3人玩牌。一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。這時,小明腦子裡突然冒出一個問題:如果不考慮花色,隻考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌

型組合一共有多少種呢?

思考:題幹資訊:

  1. 花色不考慮,那麼撲克牌的數目存在重複的情況。一張牌可能出現的情況是0,1,2,3,4;
  2. 不考慮牌的先後順序:說明撲克牌是無序性的,可以了解為将所有的牌拿到手以後已經由小到大整理好了。

解決方案

  1. 我們可以假設從數字為 “1”的牌開始依次搜尋,順便用一個變量記錄該牌的重複數。
  2. 重複數的問題可以用for循環解決,五種情況依次考慮。
  3. 撲克牌的重複數需要依次累加,如果總數達到了十三張,就可以用一個變量累加依次記錄種類數。總數超過十三張的情況就直接傳回因為情況不存在。
  4. 用一個方法開始從"1"搜尋撲克牌,并且記錄張數,但是每次撲克牌的張數與上一次搜尋數字的張數有關聯,需要再次嵌套一個該方法。這就用到了遞歸!直到判斷的總數到達 十三張,算一種情況。
#include <stdio.h>
#include <stdlib.h>
static int num=0;
void way(int ,int );
int main(int argc, char *argv[]) {
 way(0,0);                  //因為需要累加從數字為1的牌開始搜尋,是以初始化為0,且記錄牌的總數也s設定為0;
 printf("出現的所有種類數:%d",num);  
 return 0;
}
void way(int a,int sum){       //其中a表示撲克牌的數字,sum依次累加牌的總數; 
 int i;                 //用于存儲種類數; 
 if(sum>13){                //撲克牌的總數大于十三情況出錯直接return; 
  return;
 } 
 if(a==13){                 //表示搜尋到數字為13的牌就搜尋完成。搜尋完成的意思是(已經從數字1到數字13都搜尋了一次)且牌數夠了十三張;  
   if(sum==13){
   num++; 
   }
   return; 
  } 
 for(i=0;i<=4;i++){
  way(a+1,sum+i);         //遞歸到數字為a+1=1的牌開始搜尋,并且從數字為1的牌開始記錄牌總數; 
 }                 
} 
           

運作結果:

藍橋舊題_賭城玩牌問題與加法換乘法問題

問題二:加法換乘法問題

問題:把1+2+3+…+48+49中的兩個加号改成乘号(修改位置不能相鄰),使得式子的結果由1225變為2015。

思考:

  1. 假設1後邊的加換成了乘,那麼存在的情況可以是3後邊的加換乘,依次類推,直到48後加換乘,可以用for循環。
  2. 如果第二位後的加換乘,那麼第四位後可以加換乘,第五位依次類推;
  3. 如果換号後的相鄰數字相乘減去原數字的值為題幹中的(2015-1225),說明這種換号情況成立;
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
 int i,j;
 for(i=1;i<=46;i++){
  for(j=i+2;j<=48;j++){
   if((i*(i+1)+j*(j+1)-i-(i+1)-j-(j+1))==(2015-1225)){
    printf("數字%d,%d後的數字加換乘可以實作題中要求;\n",i,j);
   }
  }
 } 
 return 0;
}
           
藍橋舊題_賭城玩牌問題與加法換乘法問題