C语言编程题:(C语言)分糖果 通俗易懂
生活随笔
收集整理的這篇文章主要介紹了
C语言编程题:(C语言)分糖果 通俗易懂
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天我們來看2014年第五屆藍橋杯真題—分糖果問題
對于該題的定位為 簡單題 ,此題的邏輯很簡單,代碼通俗易懂
本題同樣,用C語言進行描述
下面我們一起來看這道題,從這道題來衍生出類似題目的做法。
傳送門
- 題目描述
- 輸入格式
- 輸出格式
- 樣例輸入
- 樣例輸出
- AC代碼
題目描述
有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然后進行下面的游戲:
每個小朋友都把自己的糖果分一半給左手邊的孩子。
一輪分糖后,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。
反復進行這個游戲,直到所有小朋友的糖果數都相同為止。
你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。
輸入格式
程序首先讀入一個整數N(2< N< 100),表示小朋友的人數。
接著是一行用空格分開的N個偶數(每個偶數不大于1000,不小于2)
輸出格式
要求程序輸出一個整數,表示老師需要補發的糖果數。
樣例輸入
3 2 2 4樣例輸出
4AC代碼
#include<stdio.h> int main() {int a,i,j,k,sum=0;scanf("%d", &a);//輸入的幾個孩子int student[a];//將孩子放在數組中,方便,易懂。好處理下面的問題。for(i=0;i<a;i++){//學生是數組,所以寫入數據的時候要用for進行書寫scanf("%d",&student[i]);//每個小朋友手上的糖果}//為何要用這個死循環,如何停止呢,下面的break繼續停止。//這里用while,同學們要想到用while的原因是要一直判斷兩邊的糖果是否一致,那一致了之后呢,用break(最后一個break)來結束while循環。while(1){j=1;//令標志位為1,為0是表示不滿足條件,需要分糖果for(i=0;i<a-1;i++){if(student[i]!=student[i+1]){//判讀兩邊的糖果是否一致j=0;//一旦有一位不相同就標志位置0并跳出這個循環break;}}if(j==0){//如果不滿足條件,開始分糖果int c=student[0]/2;//第一位的分出糖果數記錄一下,留給最后一位同學,因為是圍在一起坐的,所以是一個循環,這里是將右邊孩子的糖果給左邊,那最左邊的不能直接給最右邊的,所以多創建一個臨時變量,在后面進行間接將最左邊孩子的糖果給最右邊。for(i=0;i<a;i++){//為何要用for循環,原因是要將所有孩子的糖果都分半,所以在循環中進行自動分半。student[i]=student[i]/2;//每個同學的糖果數都減半if(i>=1){student[i-1]+=student[i];//從0位開始加上后一位同學給的糖果,這樣過后就剩最后一個同學是沒有人分糖果給他,那么我們一位的同學的糖果就可以給他了}}student[a-1]+=c;//最后一個同學的糖果給他(最左邊孩子的糖果給最右邊的孩子)for(i=0;i<a;i++){//分完糖果如果有同學手上是奇數糖果,就老師就給他一個,+1,并讓sum+1記錄老師給的糖果數,最后輸出if(student[i]%2!=0){//證明糖的數目有奇數sum++;//記錄student[i]++;//老師給了一個糖果,所以+1;}}}else{printf("%d",sum);//滿足條件的情況下j不會置0,進入這個輸出后brake跳出while循環,至此整個函數運行完畢break;}}return 0; }我主要是從代碼中講解為什么是這樣,找最清晰易懂的代碼,我覺得思路大家都懂,就是不會寫代碼,這樣的話需要大家不斷練習代碼能力才可以。后期我有時間的話,將C++代碼,Java都寫上,放假比較忙,望大家見諒,有問題,隨時歡迎大家一塊討論。
總結
以上是生活随笔為你收集整理的C语言编程题:(C语言)分糖果 通俗易懂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux(fedora) 下dvwa
- 下一篇: cocos2d-x游戏开发 跑酷(四)