2.3分糖果

发布时间 2023-04-22 20:48:33作者: Snor9

题目描述:十个小孩围成一圈分糖果,老师分给第一个孩子10块,第二个孩子2块,第三个孩子8块,第四个22块,第五个16块,第六个4块,第七个十块,第八个6块第九个十四块,第十个20块;所有的小孩同时将手中的糖分一半给右边的孩子,糖数为基数的人可以找老师要一块。问这样几次后大家手中的糖果一样多,一样多的时候是几块;

问题分析:分析题目知每个人在每一轮的时候既要将自己的糖分一半给右边的人还要得到左边人的一半,在分自己的一半时要进行一个判断,如果为基数则要先找老师要一个凑为偶数再分;当十个小孩的都一样多时循环结束,记录循环次数,并输出最后每个小孩子有多少糖果;

算法设计:

1.循环设计:由于十个人是同时进行的分一半给右边人的操作,所以这时不能单纯用一个数组本身来进行分一半和减半的行为,要借助一个工具数组来储存自己分出的那一半,然后将本身数组记录的糖果数全部减半,之后加上工具数组中自已因得的一半即b[x-1],最后得到一轮循环后十个小朋友的糖数;并且在每一次分糖果时要判断自己是否为偶数,不是就要加一。

2.判断是否相等:用循环语句遍历每一个元素,如果这个元素与上一个元素不同则返回0,一样则继续遍历,知道元素全部遍历完;

源代码:

#include<iostream>
using namespace std;
int main()
{
int a[11] = { 20,10,2,8,22,16,4,10,6,14,20 };
int cs,k,p=0;
for (cs = 0;;cs++)
{
p = 1;
for (int i = 1; i < 11; i++)
{
if (a[i] != a[i - 1]) { p = 0; continue; }
}
if (p == 1) { break; }

for (int i = 0; i <= 10; i++)
{
if (a[i] % 2 != 0) { a[i]++; }
}
int b[11];
for (int i = 0; i <= 10; i++)
{
b[i] = a[i]/2;
}
for (int i = 1; i <= 10; i++)
{
a[i] = a[i] / 2;
a[i] += b[i - 1];
}
a[0] = a[10];
for (int i = 1; i < 11; i++)
{
if (a[i] != a[i - 1]) { p = 0; continue; }
}
}
cout << "进行了" << cs << "次循环" << endl;
cout << "每个人有" << a[0] << "个糖果" << endl;
return 0;
}