用Java解决牛客网素数对(QQ5)问题

103 篇文章 1 订阅
89 篇文章 0 订阅

题目描述

给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于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);

	}

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值