BOJ 397. Prime Judge

题目在这里

题意:给出一个复数,判断是否能分解成两个复数相乘的形式,其中一个因式不能是1,-1,-i,i。如果可以,该复数为合数,如果不可以,该复数为素数。1,-1,i,-i,0,不是素数。

思路:数学界叫这个东西为高斯素数。

分情况讨论: 1.实部或虚部有一个为0。不妨设这个数为实数x。如果这个数是合数,那一定不是高斯素数。如果这个数是素数,但能表示成a ^2 + b^2的形式,可以得到因式

 x = (a + bi)(a-bi),不是高斯素数。费马平方和定理  :形如4n+1形式的素数都可以表示成a^2 +b ^2 的形式,其中a,b为正整数。 所以,只有形如4n+3形式的素数才为高斯素数。

2.实部和虚部均不为零。  

设待分解的复数为Z=a+bi,分解的因子为Z1 = a1+b1i,Z2 =a2+b2i; 则,Z= Z1 * Z2,Z^2 = Z1^2 * Z2^2; 如果Z不可以分解,那Z1,Z2中必有一个为i,-i,1,-1,可以得到,Z^2 = 1 * Z2^2 ,所以若Z为高斯素数,那Z^2 = a^2 + b^2为素数。可以证明这是一个充分必要条件。


代码如下:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
 
bool isprime(int n)
{
    int limit = sqrt((double)n);
    for (int i = 2; i <= limit; ++i)
        if (n % i == 0)
            return false;
    return true;
}
 
int main(void)
{
    int a, b;
 
    while (scanf("%d %d", &a, &b) != EOF)
    {
        if (a == 0 || b == 0){
            int sum = abs(a + b);
            if (sum == 0 || sum == 1)
                puts("NO");
            else if (isprime(sum) && (sum - 3) % 4 == 0)
                puts("YES");
            else
                puts("NO");
        }
        else if (isprime(a * a + b * b))
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值