作者 庄波
单位 山东航空学院
为了培养小朋友们分享的意识,老师教小朋友做分糖果的游戏,把自己带的糖果分给其他小朋友。
首先,全班 n 个小朋友围成一个大圆圈,按排列顺序依次给他们编号 1,2,…,n。然后,从 1 号小朋友开始,将自己的糖果平均分成三份(如果有多余的糖果则立即吃掉),自己保留一份,其余两份分别分给与他相邻的两个小朋友。接下来按照编号顺序,2 号,3 号,4 号,…,直到 n 号小朋友都这样做。
问经过一轮分糖果游戏,每个小朋友手上分别有多少个糖果?
输入格式:
第一行为小朋友人数 n,保证 3≤n≤30。
第二行为空格隔开的 n 个正整数,依次表示游戏开始时按编号从 1 到 n 的顺序每个小朋友手上的糖果数。
输出格式:
在一行中输出空格隔开的 n 个整数,依次表示游戏结束时按编号从 1 到 n 的顺序每个小朋友手上的糖果数。
输入样例:
3
3 3 3
输出样例:
3 2 1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
#include <math.h>
int main(){
int n; //定义全班一共n个小朋友
int i; //定义全局变量
scanf("%d",&n); //输入全班人数
int arr[n]; //定义数组并确定数组长度
if(n >= 3 && n <= 30){ //确保人数 3≤n≤30
for(i = 0; i <= n - 1; i++){ //for循环遍历数组
int candy;
scanf("%d",&candy); //每次输入糖果数依次存入数组中
arr[i] = candy;
}
for(i = 0; i <= n - 1; i++){ //每个小朋友分一次糖果
if(arr[i] >= 3){ //确保每位小朋友的糖果能够分为三份,因为最小正整数为1
if(i == 0){ //第一个小朋友分糖果的时候
arr[i] = (arr[i] - fmod(arr[i],3)) / 3; //首先把糖果平均分成三份,多余的自己吃点掉,留一份糖果是自己的
arr[n - 1] += arr[i];//分给上一个小朋友的糖果,即分给最后一个小朋友之后,最后一个小朋友手中的糖果;(注: 因为这里存在数组越界问题)
arr[i + 1] += arr[i];//分给下一个小朋友的糖果之后, 下一个小朋友手中的糖果
}else if(i == n - 1){ //最后一个小朋友分糖果的时候
arr[n - 1] = (arr[i] - fmod(arr[i],3)) / 3; //分糖果之后自己的糖果
arr[i - 1] += arr[n - 1]; //分给上一个小朋友之后手中的糖果
arr[0] += arr[n - 1];//分给下一个小朋友的糖果,即分给第一个小朋友之后,第一个小朋友手中的糖果;(注: 因为这里存在数组越界问题)
}else{ //其他小朋友分糖果的时候
arr[i] = (arr[i] - fmod(arr[i],3)) / 3; //分糖果后自己手中的糖果
arr[i + 1] += arr[i]; //分糖果之后下一个小朋友手中的糖果
arr[i - 1] += arr[i]; //分糖果之后上一个小朋友手中的糖果
}
}
}
}
//第一个小朋友和最后一个小朋友分糖果存在数组越界问题
for(i = 0; i <= n - 1; i++){
printf(" %d",arr[i]); //打印输出数组,即分完一轮糖果之后各小朋友手中的糖果
}
return 0;
}
标签:arr,int,分给,PTA,73,数组,小朋友,糖果
From: https://blog.csdn.net/2301_81508028/article/details/136895695