問題描述
有n個小朋友圍坐成一圈。老師給每個小朋友隨機發(fā)偶數(shù)個糖果,然后進行下面的游戲:
每個小朋友都把自己的糖果分一半給左手邊的孩子。
一輪分糖后,擁有奇數(shù)顆糖的孩子由老師補給1個糖果,從而變成偶數(shù)。
反復進行這個游戲,直到所有小朋友的糖果數(shù)都相同為止。
你的任務(wù)是預測在已知的初始糖果情形下,老師一共需要補發(fā)多少個糖果。
輸入
程序首先讀入一個整數(shù)N(2< N< 100),表示小朋友的人數(shù)。
接著是一行用空格分開的N個偶數(shù)(每個偶數(shù)不大于1000,不小于2)
輸出
要求程序輸出一個整數(shù),表示老師需要補發(fā)的糖果數(shù)。
分析
1.在循環(huán)中思考:
1.首先判斷是否完全相等,如果是相等就不需要計算了。
2.全體減半,由于大家都是偶數(shù)所以直接除以二就可以了。
3.全體成員加上前面哪個減半的數(shù),相當于把自己的糖果分享給了自己左手邊的小朋友,注意這里最后一個和第一個需要借助一個中間變量進行傳遞。
4.全體判斷奇偶,如果是奇數(shù)就+1,同時創(chuàng)建一個計數(shù)器也+1,再度進行循環(huán),等循環(huán)結(jié)束的時候輸出計數(shù)器即可。
#include <iostream>
using namespace std;
int main(){
int n,res=0;
scanf("%d",&n);
int num[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
while(1){
bool flag =true;
for(int i=1;i<n;i++){
if(num[0] != num[i]){
flag = false;
}
}
if(flag)
break;
for(int i=0;i<n;i++)
num[i] = num[i]/2;
int temp=num[n-1];
for(int i=n-1;i>0;i--){
num[i]+=num[i-1];
}
num[0]+=temp;
for(int i=0;i<n;i++){
if(num[i]%2 != 0){
num[i]++;
res++;
}
}
}
cout<<res<<endl;
return 0;
}
思考
1.關(guān)于 true 與 false 的設(shè)置,個人在邏輯上有點混亂。需注意,只有一個不相等存在,就不能跳出循環(huán)。如果寫成
bool flag =false;
for(int i=1;i<n;i++){
if(num[0] == num[i]){
flag = true;
}
}
if(flag)
break;
這個時候,只有有一個相等。即可跳出循環(huán)。
2.關(guān)于每個小朋友分一半糖果給左手邊的小朋友。
因為在做加法的,已經(jīng)加過的數(shù)會發(fā)生改變,但是這是一個圓形的循環(huán),所以需要用一個額外的變量存儲一下那個已經(jīng)改變了值。