鱼C论坛

 找回密码
 立即注册
查看: 1121|回复: 6

[已解决]我想要控制n的范围应该怎么办

[复制链接]
发表于 2020-11-17 20:35:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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



  1. #include<stdio.h>
  2. #include<math.h>
  3. int main(void)
  4. {
  5.         int a,b,n;
  6.         while(scanf("%d",&n)!=EOF)
  7.         {
  8.                 int a=n/3*4+n%3,b=n/5*7+n%5;
  9.         if(a<b)
  10.         printf("%d\n",b);
  11.         else
  12.         printf("%d\n",a);
  13.         }
  14.         return 0;
  15. }
复制代码
最佳答案
2020-11-17 20:59:55
本帖最后由 sunrise085 于 2020-11-18 00:35 编辑

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

使用道具 举报

发表于 2020-11-17 20:59:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-11-18 00:35 编辑

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

使用道具 举报

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

while(1)下面的括号里是什么意思啊。。。
还有下面那个if我也没看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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" 买,剩下不够特惠价格的钱才按非优惠价购买,下面就是根据这个思想编写的代码
  1. #include <stdio.h>

  2. main(void)
  3. {
  4.         int i , j , k , m                                             ;
  5.         printf("键入小明的钱数 : ")                                   ;
  6.         scanf("%d" , & m)                                             ;
  7.         for(i = 0 ; (i + 1) * 5 <= m ; i ++)                          ;
  8.         for(j = 0 ; (j + 1) * 3 <= m - 5 * i ; j ++)                  ;
  9.         k = m - i * 5 - j * 3                                         ;
  10.         if(i) printf("买 5 送 2 : %3d 组\n" , i)                      ;
  11.         if(j) printf("买 3 送 1 : %3d 组\n" , j)                      ;
  12.         if(k) printf("买 1 得 1 : %3d 组\n" , k)                      ;
  13.         printf("小明总共可以买到 : %3d 个西瓜\n" , i * 7 + j * 4 + k) ;
  14. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

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

  8. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

噢噢噢噢懂了懂了~谢谢!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-18 00:36:13 | 显示全部楼层
姜姜酱酱 发表于 2020-11-17 21:21
while(1)下面的括号里是什么意思啊。。。
还有下面那个if我也没看懂

我添加了一下注释
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-18 12:34:29 | 显示全部楼层
sunrise085 发表于 2020-11-18 00:36
我添加了一下注释

好滴!!谢谢!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 12:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表