题目描述
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
输出描述:
输出对数
思路:
在我看来解决此问题的关键在于首先找到输入的n 以内的所有素数,然后把素数存入到数组中(因为我们是按循序找的素数,所以找出来的素数都是按从小到大排序号的素数),找完n以内的所有素数后我们开始找到满足条件的素数对,首先判断某个素数本身加两次是否满足条件(比如10=5+5)如果是就开始考虑下一个素数,如不本身加本身不等于n 则考虑最左边的(最小的)素数和最右边的(最大的)素数和是否会满足条件,如果满足则更新最左和最有坐标,如果不是且两个加起来小于n则更新左边的坐标(因为当前的最小加上当前的最大也无法满足条件,则我们需要给当前的最大值加第二个最小值),反之更新右边坐标
喜欢的老铁们记得留个赞再走
题目链接https://www.nowcoder.com/questionTerminal/c96d6acc025541ffb79c579688f8d003
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stud[right]
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();// 输入的一个整整数
String s = "";// 定义一个字符串
String str = "";
int id = 0;// 素数的数量
// 开始查找n以内的素数,并把所有n以内的素数存入到字符串中
for (int i = 2; i < n; i++) {
int temp = 0;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
temp = 1;// 表示i不是素数
break;
}
}
if (temp == 0) {
s = s + String.valueOf(i) + "+" + str;// 把素数添加到字符串中(用+号来分开两个不同的素数)
id++;// 素数的数量+1
}
}
// System.out.println(s);
String s1 = "";// 定义一个暂时变量
String str1 = "";//
int ib = 0;// 定义的数组的id
int d[] = new int[id];// 定义一个存放素数的数组并申请空间
// 例子
// n=15
// s = 2+3+5+7+11+13
for (int i = 0; i < s.length(); i++) {
if (String.valueOf(s.charAt(i)).contains("+") == true) {// 遇到+号表示前面的字符串是素数
d[ib] = Integer.parseInt(String.valueOf(s1));// 把素数存入到数组总
ib++;
s1 = "";// 把暂时变量初始化
} else {
s1 = s1 + String.valueOf(s.charAt(i)) + str1;// 不是+号表示表示素数的字符串还没结束,所以更新暂时变量
// System.out.println(s1);
}
}
int out = 0;// 题目要求我们计算的数据
int left = 0;
int right = (id - 1);
while (left <= right) {
if (d[left] + d[left] == n) {// 如果当前的最左的素数加上本身等于n
// System.out.println(d[left]+ " " + d[right]);
out++;
left++;// 更新左边
} else if (d[right] + d[right] == n) {
// System.out.println(d[left]+ " " + d[right]);
out++;
right--;// 更新右边
} else if (d[left] + d[right] == n) {// 如果左边和右边加起来才等于n
// System.out.println(d[left]+ " " + d[right]);
// 更新两边的坐标,更新输出值
out++;
left++;
right--;
}
else if (d[left] + d[right] < n) {// 如果两边的值加起来<n
left++;// 更新左边坐标
} else if (d[left] + d[right] > n) {// >n更新右边坐标
right--;
}
}
// System.out.println(s);
System.out.println(out);
}
}