用C语言做以下的编辑题!!!

1、红英小学三年级有3个班共135人,二班比一班多5人,三班比二班少7人,三个班各有多少人?2、刘老师带了41名同学去北海公园划船,共租了10条船.每条大船坐6人,每条小... 1、红英小学三年级有3个班共135人,二班比一班多5人,三班比二班少7人,三个班各有多少人?
2、刘老师带了41名同学去北海公园划船,共租了10条船.每条大船坐6人,每条小船坐4人,问大船、小船各租几条?
3.大油瓶一瓶装4千克,小油瓶2瓶装1千克.现有100千克油装了共60个瓶子.问大、小油瓶各多少个?
展开
 我来答
自我编程
2018-12-06 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部

三题目类型实际是一样的,都可以总结成一个总数,按规则分指定份,如何分。

题目1:总数135,按规则,分成3份。(规则:二班比一班多5人,三班比二班少7人)

题目2:总数10,按规则,分成2份。(规则:见代码备注,可行方案多个,有且只有一条船可能不满)

题目3:总数60,按规则,分成2份。(规则:见代码备注,可行方案多个,有且只有一个瓶子可能不满)

代码思路,先创建数组,总量平分,多余的放在最后一个元素中。然后不断循环比较规则,按照比较结果各元素不断自增自减,直到完成周期。列举所有可能。

由于本题初始平分后总量均大于实际总量,所以循环是不断做减容比较。

理论适应其他数值,如果初始平分后总量均小于实际总量,代码中循环会不断增容比较,我没有对这种情况做识别,但不影响运行。有兴趣自己改。

增容,减容,以交换差值为数值,比如大船换小船,总容量就-2,反之+2

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
typedef int (*pv)(int *,int);//规则函数指针
void meError(void *p);
int de(int *nums,int n,int len);//数值平分给数组元素,返回余数
int *js(int zn,int gn,pv gz);//zn:总数,gn:分组个数,gz:规则函数,返回值:包含每个分组的最终分配数值的数组
int fbGZ(int *nums,int);//第一题分班规则检查函数。参数1:当前分配的数组。返回值:满足规则返回1,不满足返回0
int fcGZ(int *nums,int);//第二题分船规则检查函数。数组元素1表示大船,元素2表示小船
int fpGZ(int *nums,int);//第三题分瓶规则检查函数。数组元素1表示大瓶,元素2表示小瓶
void prAsStr(int *nums,int len);//打印数字数组
int main()
{
    printf("3个班共135人,二班比一班多5人,三班比二班少7人,最终分配方案三班人数分别:\n");
    prAsStr(js(135,3,fbGZ),3);
    printf("41名同学划船,共租10条船.大船坐6人,小船坐4人,问大、小船各租条数分别:\n");
    js(10,2,fcGZ);
    printf("\n");
    printf("100千克油装了共60个瓶子,大油瓶容量4千克,小油瓶2瓶装1千克.大、小油瓶分别:\n");
    js(60,2,fpGZ);
    return 0;
}
int fpGZ(int *nums,int len)
{
   //大油瓶一瓶装4千克,小油瓶2瓶装1千克.现有100千克油装了共60个瓶子.问大、小油瓶
    int flag;
    float z=100,bp=4,sp=0.5;//总油量,大瓶容量,小瓶容量,作为规则常量
    float sum=0,sz=0;
    if((len!=2) && printf("错误!:该规则不适用!\n"))
        return 0;
    //大瓶换小瓶,容量-3.5,小瓶换大瓶人数+3.5,只有一个瓶子可能不满
    //不满值范围(sum-z>0):0<=sum-z<bp,其中0<sum-z<sp范围大瓶小瓶任意一艘不满。sp<=sum-z<bp范围只能是大瓶不满
    sum=nums[0]*bp+nums[1]*sp;
    if(sum-z>0)
        flag=1;
    else if(sum-z<0)
        flag=0;
    while(1)
    {
        sum=nums[0]*bp+nums[1]*sp;
        sz=sum-z;
        if(!sz)
            printf("大瓶%d,小瓶%d\n",nums[0],nums[1]);
        if(sz>=sp && sz<bp)
            printf("大瓶%d,小瓶%d,一艘大瓶未满,还空%0.1fkg的容积\n",nums[0],nums[1],sz);
        if(sz>0 && sz<sp)
            printf("大瓶%d,小瓶%d,一艘小瓶或大瓶未满,还空%0.1fkg的容积\n",nums[0],nums[1],sz);
        if(sz>0)
            nums[0]--,nums[1]++;
        else
            nums[0]++,nums[1]--;
        if(sum-z==0 || (sum-z>0 && flag==0) || (sum-z<0 && flag==1))//大小船数量翻转,结束循环
            break;
    }

    return 1;
}
int fcGZ(int *nums,int len)
{
    int z=41,bp=6,sp=4,flag=0;//总人数,大船载数,小船载数,作为规则常量
    int sum=0,sz=0;
    if((len!=2) && printf("错误!:该规则不适用!\n"))
        return 0;
    //大船换小船,人数-2,小船换大船人数+2,只有一条船可能不满。
    //不满值范围(sum-z>0):0<=sum-z<bp,其中0<sum-z<sp范围大船小船任意一艘不满。sp<=sum-z<bp范围只能是大船不满
    sum=nums[0]*bp+nums[1]*sp;
    if(sum-z>0)
        flag=1;
    else if(sum-z<0)
        flag=0;

    while(1)
    {
        sum=nums[0]*bp+nums[1]*sp;
        sz=sum-z;
        if(!sz)
            printf("大船%d,小船%d\n",nums[0],nums[1]);
        if(sz>=sp && sz<bp)
            printf("大船%d,小船%d,一艘大船未满,还空%d人位置\n",nums[0],nums[1],sz);
        if(sz>0 && sz<sp)
            printf("大船%d,小船%d,一艘小船或大船未满,还空%d人位置\n",nums[0],nums[1],sz);
        if(sz>0)
            nums[0]--,nums[1]++;
        else
            nums[0]++,nums[1]--;
        if(sum-z==0 || (sum-z>0 && flag==0) || (sum-z<0 && flag==1))//大小船数量翻转,结束循环
            break;
    }

    return 1;
}
int fbGZ(int *nums,int len)
{
    int cn=0;//cn数值重分配过程中的公共池,重分配成功该必须为0
    if(len!=3 && printf("错误!:该规则不适用!\n"))
        return 0;
    while(1)
    {
        if(nums[1]-nums[0]==5 && nums[1]-nums[2]==7 && cn==0)
            break;
        while(nums[1]-nums[0]<5)
            nums[1]++,nums[2]++,cn-=2;
        while(nums[1]-nums[0]>5)
            nums[1]--,nums[2]--,cn+=2;
        while(nums[1]-nums[2]<7)
            nums[1]++,nums[0]++,cn-=2;
        while(nums[1]-nums[2]>7)
                nums[1]--,nums[0]--,cn+=2;
        cn=de(nums,cn,len);
        nums[len-1]+=cn;//不能均分,余数给最后一个元素,继续循环分配
    }
    return 1;
}
void prAsStr(int *nums,int len)
{
    int i;
    for(i=0;i<len;i++)
        printf("%d ",nums[i]);
    printf("\n\n");

}
int de(int *nums,int n,int len)//数值平分给数组元素(数组必须有初值,累加),返回余数
{
    int i,c=n/len,y=n%len;
    for(i=0;i<len;i++)
        nums[i]+=c;
    return y;
}
int *js(int zn,int gn,pv gz)//zn:总数,gn:分组个数,nums:数组,gz:规则函数,返回值:包含每个分组的最终分配数值的数组
{
    int i;
    int *nums=(int *)malloc(sizeof(int)*gn);
    meError(nums);
    for(i=0;i<gn;i++)
        nums[i]=0;
    nums[gn-1]+=de(nums,zn,gn);//数组初值放平均值,平分后多余值给最后一个元素

    gz(nums,gn);
    return nums;
}
void meError(void *p)
{
    if(p==NULL)
    {
        printf("异常:内存申请失败!回车结束程序!\n");
        while(getch()!='\r');
        exit(0);
    }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式