| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 619 人关注过本帖, 1 人收藏
标题:hud 2012 题 素数判定 求解哪里错了?
只看楼主 加入收藏
风雨123
Rank: 2
等 级:论坛游民
帖 子:84
专家分:65
注 册:2013-2-23
结帖率:66.67%
收藏(1)
已结贴  问题点数:10 回复次数:9 
hud 2012 题 素数判定 求解哪里错了?

素数判定

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 56842    Accepted Submission(s): 19531


Problem Description
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
 

Input
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
 

Output
对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。
 

Sample Input
0 1
0 0
 

Sample Output
OK
 
程序代码:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    int x,y,j,k;
    while(cin>>x>>y)
    {
        if(x==0 && y==0)
            break;
        for(x; x<=y ;++x)
        {    k=1;
             j=x*x+x+41;
            for(int i=2;i<=(sqrt(j)); i++)
            { 
                if(j%i==0)
                {
                    k=0;
                    break;
                }
            }
            if(k==0)
                break;
        }
        if(k==0)
            cout<<"Sorry"<<endl;
        else
            cout<<"OK"<<endl;
    }
    return 0;
}
这是什么错误

View Compilation Error

0_0_8856365_32655.cpp
0_0_8856365_32655.cpp(15) : error C2668: “sqrt” : 对重载函数的调用不明确
        \include\math.h(626): 可能是“long double sqrt(long double)”
        \include\math.h(578): 或       “float sqrt(float)”
        \include\math.h(200): 或       “double sqrt(double)”
        试图匹配参数列表“(int)”时
搜索更多相关主题的帖子: Memory 表达式 Java 
2013-08-07 13:03
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
只说你的代码
sort 有三种重载形式,分别是
float sqrt(float)
double sqrt(double)
long double sqrt(long double)
而你的代码中传给sqrt的参数类型是int,编译器不知道你想要哪个重载
2013-08-07 13:26
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用rjsp在2013-8-7 13:26:15的发言:

只说你的代码
sort 有三种重载形式,分别是
float sqrt(float)
double sqrt(double)
long double sqrt(long double)
而你的代码中传给sqrt的参数类型是int,编译器不知道你想要哪个重载

+1

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-07 13:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50)
--- 也就是表达式的值范围是 [41,2591],求这个范围的素数

n^2+n+41
--- [(n+1)^2+(n+1)+41] - [n^2+n+41] = 2*(n+1)


[ 本帖最后由 rjsp 于 2013-8-7 14:42 编辑 ]
2013-08-07 13:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
假设是合数,则有 n^2+n+41 == (n+a)(n+b)
n^2+n+41 == n^2 + (a+b)n + ab
即 n = (41-ab)/(a+b-1)
如果a+b等于1,这个公式是无意义的,假设a+b==1,则 n^2+n+41 == n^2 + n + ab => ab=41,而a+b=1且ab=41是无解的(一元二次方程delta小于0)
现在只有避开 n == (41-ab)/(a+b-1) 的整数解就行了



[ 本帖最后由 rjsp 于 2013-8-7 14:12 编辑 ]
2013-08-07 14:02
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
用的是最简单的方法(因为这代码最好写^_^),先求素数列表
程序代码:
#include <iostream>
using namespace std;

int main()
{
    // -39<=n<=50 n^2+n+41
    // (+50)*(+50)+(+50)+41 = 2591
    // 2591^0.5 = 50
    bool mask[2592] = { false }; // true为合数
    for( size_t i=2; i<=50; ++i )
    {
        if( mask[i] )
            continue;
        for( size_t j=i+i; j<2592; j+=i )
            mask[j] = true;
    }

    for( int x,y; cin>>x>>y && !(x==0 && y==0); )
    {
        for( ; x<=y && !mask[x*x+x+41]; ++x );
        cout << (x>y?"OK":"Sorry") << endl;
    }


    return 0;
}
还可以将 x*x+x+41 先算掉
程序代码:
#include <iostream>
using namespace std;

int main()
{
    // 先求素数表
    // -39<=n<=50 n^2+n+41
    // (+50)*(+50)+(+50)+41 = 2591
    // 2591^0.5 = 50
    bool mask[2592] = { false }; // true为合数
    for( size_t i=2; i<=50; ++i )
    {
        if( mask[i] )
            continue;
        for( size_t j=i+i; j<2592; j+=i )
            mask[j] = true;
    }

    // 再求-39到50中哪些数行,哪些数不行
    bool table[90]; // 索引从-39开始
    for( int n=-39; n<=50; ++n )
        table[n+39] = mask[n*n+n+41];

    for( int x,y; cin>>x>>y && !(x==0 && y==0); )
    {
        for( ; x<=y && !table[x+39]; ++x );
        cout << (x>y?"OK":"Sorry") << endl;
    }


    return 0;
}
甚至直接写成
程序代码:
#include <iostream>

int main()
{
    for( int x,y; cin>>x>>y && !(x==0 && y==0); )
        std::cout << ( ( y<=39 || (x>=42 && y<=43) || (x>=45 && y<=48) || x>=50 ) ? "OK" : "Sorry" ) << std::endl;

    return 0;
}



[ 本帖最后由 rjsp 于 2013-8-7 15:09 编辑 ]
2013-08-07 14:46
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
以下是引用rjsp在2013-8-7 13:26:15的发言:

只说你的代码
sort 有三种重载形式,分别是
float sqrt(float)
double sqrt(double)
long double sqrt(long double)
而你的代码中传给sqrt的参数类型是int,编译器不知道你想要哪个重载

怎么解决楼主这个问题?新手求教呀

思考赐予新生,时间在于定义
2013-08-08 09:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 7楼 love云彩
对于C++,强制转化一下,如下
sqrt( float(j) )
sqrt( double(j) )
sqrt( long double(j) )
但强制转化写起来不好看,所以还可以用如下进行隐式提升方法
sqrt( j*1.0f )
sqrt( j*1.0 )
sqrt( j*1.0L )

对于C,是没有函数重载的,因此可以直接写成
sqrtf( j )
sqrt( j )
sqrtfl( j )
2013-08-08 10:47
szgg520
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:79
专家分:307
注 册:2011-6-13
收藏
得分:0 
楼上是明白人....

[url=http://www.]深圳复印机出租[/url]
2013-08-08 12:01
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
以下是引用rjsp在2013-8-8 10:47:18的发言:

对于C++,强制转化一下,如下
sqrt( float(j) )
sqrt( double(j) )
sqrt( long double(j) )
但强制转化写起来不好看,所以还可以用如下进行隐式提升方法
sqrt( j*1.0f )
sqrt( j*1.0 )
sqrt( j*1.0L )

对于C,是没有函数重载的,因此可以直接写成
sqrtf( j )
sqrt( j )
sqrtfl( j )
受教啦,谢谢R版

思考赐予新生,时间在于定义
2013-08-08 13:41
快速回复:hud 2012 题 素数判定 求解哪里错了?
数据加载中...
 
   



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

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