| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 665 人关注过本帖, 1 人收藏
标题:ACM的题目,你也来做做吧!
只看楼主 加入收藏
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
结帖率:98.26%
收藏(1)
已结贴  问题点数:20 回复次数:5 
ACM的题目,你也来做做吧!
今天晚上做ACM题的时候遇到了这样一道题,当时我的思路是想通过求解方程的解来判断,可是发现这种思路太垃圾了,于是就先不管了,寻思着等吃完饭之后再看看吧。吃饭的时候和同学讨论了一下这道题,最后我发现这个可以通过因式分解来做,于是吃完饭之后就把代码写了出来,调式了一下,就通过了!

在这里把这道题贴出来,给大家看看,然后再把我的代码贴出来,给大家看看,并不是想告诉大家我有多牛,只是想说明一个问题:做题的思路与方法很重要

同时也希望学习编程的学生能够多去做做关于ACM的题,毕竟可以锻炼你的解题的思路!!同时对自身的编程能力与水平是一个很大的提高和进步!

有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。
例如:
x + y = 9,x * y = 15 ? 找不到这样的整数x和y
1+4=5,1*4=4,所以,加起来等于5,乘起来等于4的二个整数为1和4
7+(-8)=-1,7*(-8)=-56,所以,加起来等于-1,乘起来等于-56的二个整数为7和-8

 
Input
输入数据为成对出现的整数n,m(-10000<n,m<10000),它们分别表示整数的和与积,如果两者都为0,则输入结束。


Output
只需要对于每个n和m,输出“Yes”或者“No”,明确有还是没有这种整数就行了。

Sample Input
9 15
5 4
1 -56
0 0
Sample Output
No
Yes
Yes

这个是我写的代码:

程序代码:
# include <stdio.h>

#define BOOL int

int main()
{
    int n , m ;
    int i , j , a ;
    BOOL flag ;
    while(scanf("%d%d" , &n , &m) != EOF && (n != 0 || m != 0))
    {
        flag = 0 ;
        a = m ;
        if(m < 0)
            m = -m ;
        for(i = -m ; i <= m ; i++)
            if(i != 0 && m % i == 0)
            {
                j = a / i ;
                if(j + i == -n)
                {
                    flag = 1 ;
                    break ;
                }
            }
        if(flag == 1)       
            printf("Yes\n") ;
        else
            printf("No\n") ;
    }
    return  0 ;
}
搜索更多相关主题的帖子: ACM 
2010-12-11 21:15
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:15 
我说,为什么不直接用解二次方程的公式法,然后验证根是不是整数呢?

设:
x + y = m
xy = n
可得:
sqrt(m*m - 4*n) = x - y (x,y地位对等,假设x>y)

解得:
x = (m + sqrt(m*m - 4*n)) / 2
y = (m - sqrt(m*m - 4*n)) / 2

计算的时候,验证m*m >= 4*n ,和x y是整数就行了,for循环也省了

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-12-11 21:30
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 2楼 御坂美琴
当时想到了这种方法,可是后来觉得这种方法需要计算一个乘方与四倍,如果输入的数太大了。可能会超出了int类型的范围,如果定义成double类型的话在判断x 和 y是否是整数的时候比较麻烦,于是就想出了我的那种方法,嘻嘻!

愿用余生致力编程
2010-12-11 21:48
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:5 
根据题目给的范围,完全是不会超int范围的

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-12-11 23:12
我是西瓜
Rank: 2
等 级:论坛游民
帖 子:61
专家分:97
注 册:2010-10-22
收藏
得分:0 
我表示呵呵
2010-12-12 01:42
寂静流年
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-4-12
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    long long n,m,x,y;
    int i;
    scanf("%I64d%I64d",&n,&m);
    if(m<0) i=-m;
    else i=m;
    while(n!=0||m!=0)
    {

        for(x=-i; x<=i; x++)
        {
            if(x!=0&&m%x==0)
            {
                y=m/x;
                if(x+y==n)
                {
                    printf("YES\n");
                    break;
                }
            }

        }
        if(x>i) printf("NO\n");
        scanf("%I64d%I64d",&n,&m);
        if(m<0) i=-m;
    else i=m;
    }
    return 0;
}
我的思路和你一样,可是我的老是Output Limit Exceeded,求解!
2013-04-12 23:47
快速回复:ACM的题目,你也来做做吧!
数据加载中...
 
   



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

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