分糖果-交换糖果
问题描述
南京家禾齐修幼儿园,有5个小朋友,编号分别是 1 、2 、3 、4 、5.他们按照自己的编号顺序围在一张圆桌盘。他们身上都有若干个糖果(键盘输入),现在他们做一个分糖果游戏。
从1号小朋友开始,将自己的糖果平均分成3份(如果有多的立刻吃掉),自己留一份,其他2份,给相邻的小朋友。接着2、3、4、5号小朋友同样这么做。
问一轮后,小朋友手上分别有多少糖果?
5个变量解法
void m90008(){
// 定义5个变量,表示5位小朋友当前有的糖果
int c1,c2,c3,c4,c5;
printf("请输入5位小朋友当前分别有的糖果数量: ");
cin>>c1>>c2>>c3>>c4>>c5;
printf("分配前,c1==%2d,c2==%2d,c3==%2d,c4==%2d,c5==%2d.\n",c1,c2,c3,c4,c5);
// c1 分给 c2和c5
c1=c1/3;
c2+=c1;
c5+=c1;
// c2 分给 c3和c1
c2=c2/3;
c3+=c2;
c1+=c2;
// c3 分给 c4和c2
c3=c3/3;
c4+=c3;
c2+=c3;
// c4 分给 c5和c3
c4=c4/3;
c5+=c4;
c3+=c4;
// c5 分给 c1和c4
c5=c5/3;
c1+=c5;
c4+=c5;
printf("变量解法 分配后,c1==%2d,c2==%2d,c3==%2d,c4==%2d,c==%2d.\n",c1,c2,c3,c4,c5);
}
数组解法
void m90008_a(){
// 定义一个数组存储5位小朋友的糖果,索引下标从0开始
short stu[5];
printf("请输入5位小朋友当前分别有的糖果数量: ");
cin>>stu[0]>>stu[1]>>stu[2]>>stu[3]>>stu[4];
printf("分配前,");
for(int i=0;i<5;i++){
printf(",stu[%d]==%2d",i,stu[i]);
}
printf("\n");
stu[0]=stu[0]/3;
stu[1]+=stu[0];
stu[4]+=stu[0];
stu[1]=stu[1]/3;
stu[2]+=stu[1];
stu[0]+=stu[1];
stu[2]=stu[2]/3;
stu[3]+=stu[2];
stu[1]+=stu[2];
stu[3]=stu[3]/3;
stu[4]+=stu[3];
stu[2]+=stu[3];
stu[4]=stu[4]/3;
stu[0]+=stu[4];
stu[3]+=stu[4];
// 数组长度很大的时候,推荐采用for输出,看优化后的方式
printf("数组解法 分配后,stu[0]==%2d,stu[1]==%2d,stu[2]==%2d,stu[3]==%2d,stu[4]==%2d.\n",stu[0],stu[1],stu[2],stu[3],stu[4]);
}
数组解法优化-提炼分配函数
// 函数申明
void m90008_b_allocate(int i,short stu []);
void m90008_b(){
// 定义一个数组存储5位小朋友的糖果,索引下标从0开始
short stu[5];
printf("请输入5位小朋友当前分别有的糖果数量: ");
cin>>stu[0]>>stu[1]>>stu[2]>>stu[3]>>stu[4];
printf("分配前,");
for(int i=0;i<5;i++){
printf(",stu[%d]==%2d",i,stu[i]);
}
printf("\n");
for(int i=0;i<5;i++){
m90008_b_allocate(i, stu);
}
printf("数组解法优化 分配后,");
for(int i=0;i<5;i++){
printf(",stu[%d]==%2d",i,stu[i]);
}
printf("\n");
}
void m90008_b_allocate(int i, short stu []){
if(i==0){ // 边界处理
stu[i]=stu[i]/3;
stu[i+1]+=stu[i];
stu[4]+=stu[i];
}else if(i==4){ // 边界处理
stu[i]=stu[i]/3;
stu[0]+=stu[i];
stu[i-1]+=stu[i];
}else {
stu[i]=stu[i]/3;
stu[i+1]+=stu[i];
stu[i-1]+=stu[i];
}
}
运行效果
#include <iostream>
using namespace std;
void m90008();
void m90008_a();
void m90008_b();
int main() {
std::cout << "尘远同学编程-少年班欢迎您! 报名热线 : 025 - 8662 0610" <<std::endl;
m90008();
m90008_a();
m90008_b();
return 0;
}
分糖果其他问题
1、 分到最多种类问题
2、