标题:买小猫小狗,OJ上显示25%的错误
只看楼主
Redeyes
Rank: 4
来 自:中国
等 级:业余侠客
威 望:1
帖 子:301
专家分:292
注 册:2015-5-13
结帖率:86%
已结贴  问题点数:20 回复次数:19 
买小猫小狗,OJ上显示25%的错误
题目:某动物饲养中心用X元专款购买小狗(每只A元)和小猫(每只B元)两种小动物。 要求专款专用,(至少猫狗各一),正好用完?请求出方案的总数。如没有请输出0.
输入
输入一行,只有三个整数.分别为X,A,B. ( 100 < X < 32768; 1 <= A, B <= 100 )
输出
输出只有一行(这意味着末尾有一个回车符号),包括1个整数。
样例输入
1700 31 21
样例输出
3
代码如下:
程序代码:
#include<stdio.h>
int main()
{
    int a,b,i,j,count=0;
    long int x; //i 小猫 j小狗 
    scanf("%ld%d%d",&x,&a,&b);
    for(i=1;i<=100;i++){
        for(j=1;j<=100;j++){
            
            if((i*a+b*j==x)&&(i>=1)&&(j>=1))
                count++;
            else
                continue;
        }
    }
    printf("%d\n",count);
    return 0;
}

样例输入输出正确,但我觉得还是少考虑些条件,能力有限,请各位指点一下^_^
搜索更多相关主题的帖子: 动物 小狗 color 小猫 count 
2016-04-11 19:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:1 
为什么i 和j必须小于等于100?似乎题目中没这个限定吧
2016-04-11 19:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:1 
这道题的核心就是求a和b的最小公倍数
即多少个a等值于多少个b
2016-04-11 20:10
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:2 
回复 3楼 rjsp
和公倍数没什么关系
比如
一共 5 块钱
一只猫 2 元
一只狗 3 元
公倍数是 6
没什么参考价值

https://zh.
2016-04-11 21:03
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:3 
楼主的问题应该是 int 类型 取值范围
目测楼主用的 oj 的 int 是2个字节
i*a+b*j 的结果可能会溢出 导致结果出错

楼主可以试试把 i*a+b*j 改为 i*a+b*j*1L
提交看看结果对不对

另外 楼主的代码中 (i>=1)&&(j>=1) 这两个限制是多余的
因为 循环本来就是从 1 开始 不可能出现小于1 的情况

            else
                continue;

也是多余的 可以删掉
在这个if语句 后面还有代码 才需要考虑是不是要 continue

https://zh.
2016-04-11 21:10
Redeyes
Rank: 4
来 自:中国
等 级:业余侠客
威 望:1
帖 子:301
专家分:292
注 册:2015-5-13
得分:0 
回复 5楼 lin5161678
谢谢!有些事我多虑了,“可以试试把 i*a+b*j 改为 i*a+b*j*1L ”,这句话我不理解,因为我在编译器上运行时错的。而且我觉得x的输入范围属于int类型的啊

做一名健壮的技术青年,如果未来无法用代码去改变世界,还可以考虑去搬砖。
2016-04-11 21:56
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
得分:3 
程序代码:
#include<stdio.h>
int main()
{
    int a,b,i,j,count=0,total;
    long int x; //i 小猫 j小狗 
    scanf("%ld%d%d",&x,&a,&b);
    for(i=1;;i++){
        for(j=1;;j++){
            total=i*a+j*b;
            if(total==x)
                count++;
            else if(total>=32768)
                goto end;
        }
    }
    end:printf("%d\n",count);
    return 0;
}

楼主可以试试这段代码,虽然用goto不太好。

未佩好剑,转身便已是江湖
2016-04-11 22:12
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:2 
回复 7楼 alice_usnet
楼主用的循环从 1~100 是合理的
你可以看看 题目对数据规模的描述
输入一行,只有三个整数.分别为X,A,B. ( 100 < X < 32768; 1 <= A, B <= 100 )

https://zh.
2016-04-11 22:14
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:2 
回复 6楼 Redeyes
1L是一个 long 常量
目的是为了把表达式 b*j*1L 的结果隐式转换为 long
再把前面的 i*a+long 的结果转换为 long

你所说的出错是什么错
编译错误吗 贴出编译提示?
运行错误吗 描述清楚运行遇到什么问题

另外我的这个转换的确有点欠考虑 应该从前面开始转换 你试试看
1L * i * a + 1L * b * j
这样比较合理

原先的做法 如果 i * a 就超过int取值范围的话 结果一样会出错
改成 1L * i 就会先得到一个long操作数
其实就是
(long)i*a + (long)b*j
因为这样写字符太多
我偷懒 用 1L* 来做数据类型转换

https://zh.
2016-04-11 22:19
Redeyes
Rank: 4
来 自:中国
等 级:业余侠客
威 望:1
帖 子:301
专家分:292
注 册:2015-5-13
得分:0 
回复 7楼 alice_usnet
谢谢,您的程序的基本语法和结构都没问题,但我刚运行了下,样例输出是0啊! 是不是哪地方逻辑出问题了

做一名健壮的技术青年,如果未来无法用代码去改变世界,还可以考虑去搬砖。
2016-04-13 17:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-463531-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.211592 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved