姜姜酱酱 发表于 2020-11-17 20:35:50

我想要控制n的范围应该怎么办

西大东门有超级多的西瓜!小西走到东门,希望能和舍♂友一起享受。

但是小西身上只有n( 0<n<10000)块钱, 一个瓜需要一块钱,店家有两个特价方案,一种是买3送1,一种是买5送2!

小西希望自己能买到最多的西瓜,你能帮帮她吗



#include<stdio.h>
#include<math.h>
int main(void)
{
        int a,b,n;
        while(scanf("%d",&n)!=EOF)
        {
                int a=n/3*4+n%3,b=n/5*7+n%5;
        if(a<b)
        printf("%d\n",b);
        else
        printf("%d\n",a);
        }
        return 0;
}

sunrise085 发表于 2020-11-17 20:59:55

本帖最后由 sunrise085 于 2020-11-18 00:35 编辑

你的程序不单单是控制n的范围的问题,运算结果也是不对的。
比如8元钱最多能买11个西瓜(7+4),但是你的程序算出的结果是10个(7+3)
#include<stdio.h>
#include<math.h>
int main(void)
{
    int a,b,n;
    int flag=1;
    while(1)
    {
      while(1){//这个内层循环是用来控制输入范围的,若输入数值不在范围之内则需要重新输入
            flag=scanf("%d",&n);//判断是否有正确输入,如果输入数字,则flag为1
            if (n>0 && n<10000)//判断n是否在范围之内,
                break;//若在范围之内,则跳出内层循环
            printf("超出范围了,请重新输入!\n");
      }
      if (flag!=1)//若flag不为1,说明没有输入数字,则结束循环
            break;
      a=n/5*7+n%5;//按照最大的买,买5送2,
      if(n%5>=3)//若余数超过3,则在买3送1,即再增加一个西瓜
            a+=1;
      printf("%d元最多买%d个西瓜\n",n,a);
    }
    return 0;
}

姜姜酱酱 发表于 2020-11-17 21:21:23

sunrise085 发表于 2020-11-17 20:59
你的程序不单单是控制n的范围的问题,运算结果也是不对的。
比如8元钱最多能买11个西瓜(7+4),但是你的 ...

while(1)下面的括号里是什么意思啊。。。
还有下面那个if我也没看懂{:10_266:}

jackz007 发表于 2020-11-17 21:23:57

本帖最后由 jackz007 于 2020-11-17 21:31 编辑

      3和 5 都是质数,它们的最小公倍数是 15,同样花 15 块钱,如果按非特惠价购买,可以买到 15 个西瓜,如果按 "买3送1" 方案可以买到 (3 + 1) × 5 = 20 个,如果按 "买5送2" 方案可以买到 (5 + 2)× 3 = 21 个,显然,购买策略应该是尽可能多按 "买5送2" 方案买,剩下的钱尽量按 "买3送1" 买,剩下不够特惠价格的钱才按非优惠价购买,下面就是根据这个思想编写的代码
#include <stdio.h>

main(void)
{
      int i , j , k , m                                             ;
      printf("键入小明的钱数 : ")                                 ;
      scanf("%d" , & m)                                             ;
      for(i = 0 ; (i + 1) * 5 <= m ; i ++)                        ;
      for(j = 0 ; (j + 1) * 3 <= m - 5 * i ; j ++)                  ;
      k = m - i * 5 - j * 3                                       ;
      if(i) printf("买 5 送 2 : %3d 组\n" , i)                      ;
      if(j) printf("买 3 送 1 : %3d 组\n" , j)                      ;
      if(k) printf("买 1 得 1 : %3d 组\n" , k)                      ;
      printf("小明总共可以买到 : %3d 个西瓜\n" , i * 7 + j * 4 + k) ;
}
      编译、运行实况
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
键入小明的钱数 : 189
买 5 送 2 :37 组
买 3 送 1 :   1 组
买 1 得 1 :   1 组
小明总共可以买到 : 264 个西瓜

D:\00.Excise\C>

姜姜酱酱 发表于 2020-11-17 21:36:47

jackz007 发表于 2020-11-17 21:23
3和 5 都是质数,它们的最小公倍数是 15,同样花 15 块钱,如果按非特惠价购买,可以买到 15 个 ...

噢噢噢噢懂了懂了~谢谢!!{:10_323:}

sunrise085 发表于 2020-11-18 00:36:13

姜姜酱酱 发表于 2020-11-17 21:21
while(1)下面的括号里是什么意思啊。。。
还有下面那个if我也没看懂

我添加了一下注释

姜姜酱酱 发表于 2020-11-18 12:34:29

sunrise085 发表于 2020-11-18 00:36
我添加了一下注释

好滴!!谢谢!!
页: [1]
查看完整版本: 我想要控制n的范围应该怎么办