这道题目用c语言怎样解答?

 我来答
自我编程
2019-10-16 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部

思路:将商品按单价降序排序,先买最大值商品,再买最小值商品。最终余额最小。

我的代码中你如不想打印具体方案实施信息,就将该常量showInfo置0。

#include<stdio.h>

#include<malloc.h>

#define showInfo 1//是否打印方案信息,1打印,0不打印

typedef struct good

{

    int goodId;//货物编号

    char name[20];//货物名称

    int value;//货物价格(单位分)

    int bBuy;//被购买的个数(本题不做要求)

}GOD;

int *getLeastValue(int *n,GOD *goods,int nLen,int gLen);//获取最小找零金额

void showPlanInfo(int n,int m,int y,GOD g);//打印购买方案信息,n初始总金额,m当前剩余金额,g当前购买商品

int main()

{

    int i,t,*n=NULL,*m=NULL;

    GOD goods[3]={{1,"矿泉水",150,0},{2,"可乐",200,0},{3,"橙汁",350,0}};

    scanf("%d",&t);

    n=(int *)malloc(sizeof(int)*t);

    if(!n)

        return 0;

    for(i=0;i<t;i++)

        scanf("%d",&n[i]);

    m=getLeastValue(n,goods,t,3);

    for(i=0;i<t;i++)

        printf("%d\n",m[i]);

    return 0;

}

int *getLeastValue(int *n,GOD *goods,int nLen,int gLen)//获取最小找零金额

{

    GOD gSave;

    int i,j,*money=NULL,y;

    money=(int *)malloc(sizeof(int)*nLen);

    if(!money)

        return NULL;

    for(i=0;i<gLen;i++)

        for(j=i+1;j<gLen;j++)

            if(goods[i].value<goods[j].value)

                gSave=goods[i],goods[i]=goods[j],goods[j]=gSave;

    for(i=0;i<nLen;i++)

    {

        y=money[i]=n[i];//y记录上一次余额

        for(j=0;j<gLen;j++)

        {

            if(money[i]>=goods[j].value)

            {

                goods[j].bBuy=money[i]/goods[j].value;

                money[i]=money[i]%goods[j].value;//本次购买后的余额

                showPlanInfo(n[i],y,money[i],goods[j]);

                y=money[i];

            }

        }

    }

    return money;

}

void showPlanInfo(int n,int m,int y,GOD g)//打印购买方案信息,n初始总金额,m当前剩余金额,g当前购买商品

{

    static int cnt=1;

    if(showInfo)

    {

        if(m==n)

        {

            printf("方案%d:",cnt++);

            printf("初始金额:%d,",n);

        }

        else

        {

            printf("当前剩余额:%d,",m);

        }

        printf("预购买商品%s,单价%d,预购买数量%d,余额%d\n",g.name,g.value,g.bBuy,y);

    }

}

匿名用户
2019-10-16
展开全部

#include<stdio.h>


int main()


{

int T;

int a[T];


int i;

int j=0;

scanf("%d",&T);


for(i=0;i<T;i++)


{


scanf("%d",&a[i]);

}

for(i=0;i<T;i++)

{


while(a[i]>=150&&a[i]<=10000)

{

a[i] = a[i]-150;


j++;


}


if(j>0)

{

if(a[i]<150&&a[i]>=50)

a[i]=a[i]-200+150;

}


printf("%d\n",a[i]);

}

return 0;

}

用手机写的 所以粘贴过来缩进很怪

代码写的不够好,初步测试正确,详细的不知道

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友e7d358b
2019-10-16 · TA获得超过1964个赞
知道小有建树答主
回答量:1399
采纳率:89%
帮助的人:163万
展开全部
图片看不清
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式