解题思路:
首先要清楚这个题目的要求:
分开糖果的这个动作是同时进行的,也就是说,第一个传给第二个人的同时,第二个也在传给第三个,第三个又传给....直到最后一个传给第一个人。
可以用两个数组来进行解题,一个用来变化,一个用来储存,因为在变化的同时,还要用到原先的数目(希望读者首先理解题意)。
注意事项:在进行赋值变化的时候,注意要用原先没有发生变化的数值,不能只作用在一个数组上,否则就会造成用新变化的数去计算的结果,导致出现BUG。
参考代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define MAX 100
int main() {
int n = 0;
int arr[MAX]={0};
int i,j,k;
int b[MAX]={0};
int flag=0;
int count = 0;
scanf_s("%d\n", &n);
for (i = 0; i < n; i++) {
scanf_s("%d", &arr[i]);
}
for (j = 0; j < n; j++) {
b[j] = arr[j];
}
while (1) {
flag = 0;
for (i = 0; i < n-1; i++) {
arr[i + 1] = b[i] / 2 + b[i + 1] / 2;
}
if (i == n - 1) {
arr[0] = b[n - 1] / 2 + b[0] / 2;
}
for (i = 0; i < n; i++) {
if (arr[i] % 2 != 0) {
count++;
arr[i] += 1;
}
}
for (i = 1; i < n; i++) {
if (arr[0]!= arr[i])
flag = 1;
}
if (flag == 0)//给我的教训就是如果紧挨着判断条件的值一样,那么很有可能出BUG
break;
for (j = 0; j < n; j++) {
b[j] = arr[j];
}
}
printf("%d", count);
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复