A. 孪生素数

 

题目描述:

所谓孪生素数指的就是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了,就象孪生兄弟一样。

最小的孪生素数是 (3, 5),在 100 以内的孪生素数还有 (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61) 和 (71, 73),总计有 8 组。

但是随着数字的增大,孪生素数的分布变得越来越稀疏,寻找孪生素数也变得越来越困难。那么会不会在超过某个界限之后就再也不存在孪生素数了呢?

孪生素数有无穷多对!这个猜想被称为孪生素数猜想,至今没有被严格证明。但借助于计算机我们确实可以找到任意大数范围内的所有孪生素数对。

输入正整数n(n<=1000000),求n以内(不含n)的所有孪生素数对的个数。

 

思路:

正常判断素数,采取一种高效的判断方法:大于等于5的素数一定和6的倍数相邻

bool isPrime(int m) {
    if(m == 2 || m == 3) return true;
    if(m % 6 != 1 && m % 6 != 5) return false; //不在6倍数两侧一定不是素数
    int nums = sqrt(m);
    for(int i = 5; i <= nums; i++){
        if(m % i == 0 || m % (i + 2) == 0) return false;
    } //判断在6倍数两侧的素数情况
    return true;
}

 

代码:

#include <iostream>   
#include <bits/stdc++.h> 
using namespace std;  

bool isPrime(int m) {
    if(m == 2 || m == 3) return true;
    if(m % 6 != 1 && m % 6 != 5) return false;
    int nums = sqrt(m);
    for(int i = 5; i <= nums; i++){
        if(m % i == 0 || m % (i + 2) == 0) return false;
    }
    return true;
}

int soluation(int n) {
    int res = 0;
    for(int i = 2; i < n - 2; i++){
        if(isPrime(i) && isPrime(i + 2)){
            res++;
        }
    }
    return res;
}

int main(){  
    int n;
    scanf("%d", &n);
    printf("%d",soluation(n));
    return 0;
}

 

B. 位平方和

 

题目描述:

把一个整数的每个数位都平方后求和,又得到一个整数,我们称这个整数为:位平方和。

对新得到的整数仍然可以继续这一运算过程。

比如,给定整数为4,则一系列的运算结果为:

16,37,58,89,....

本题的要求是,已知一个整数x,求第n步的运算结果。

 

思路:

注意递归调用时参数的改变情况即可。

 

代码:

#include <iostream>   
#include <bits/stdc++.h> 
using namespace std;  

int soluation(int x) {
    int sum = 0, num = 0;
        while(x){
            num = x % 10;
            sum += pow(num, 2);
            x /= 10;
        }
    return sum;
}

int main(){  
    int x, n;
    scanf("%d %d", &x, &n);
    while(n){
        x = soluation(x);
        n--;
    }
    printf("%d", x);
    return 0;
}

 

 

C. 埃及分数

 

题目描述:

古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解。古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式。

这里,a 和b 必须是不同的两个整数,分子必须为 1

比如,2/15 一共有4种不同的分解法(姑且称为埃及分解法):
1/8 + 1/120

1/9 + 1/45

1/10 + 1/30

1/12 + 1/20

那么,2/45一共有多少个不同的埃及分解呢(满足加法交换律的算同种分解)?

编程输出满足要求的分解数目。

 

思路:

暴力查找符合情况,注意符合情况时的判断 (分母和分子乘以2/45的倒数得一)

 

代码:

#include <iostream>   
#include <bits/stdc++.h> 
using namespace std;  

int soluation() {
    int res = 0;
    for(int i = 2; i < 45; i++){
        for(int j = 2; j < pow(45, 2); j++){
            int fz = i + j, fm = i * j;
            if(2 * fm == 45 * fz) res++;
        }
    }
    printf("%d", res);
}

int main(){  
    soluation();
    return 0;
}