分糖果-交换糖果

241 阅读3分钟

分糖果-交换糖果

问题描述

南京家禾齐修幼儿园,有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;


}

image.png

分糖果其他问题

1、 分到最多种类问题

juejin.cn/spost/73027…

2、