【编程马拉松】【003-素数和】
2016-05-29 11:12
369 查看
【编程马拉松算法目录>>>】
【003-素数和】【工程下载>>>】
1 题目描述
NowCoder发现某些整数可以拆分成两个不同的素数的和。例如7=2+5、20=3+17=7+13等。他想知道每个正整数都有几种拆分的方法,你能帮他解决吗?
1.1 输入描述:
输入包括多组数据。每组数据仅有一个整数n (1≤n≤100000)。
1.2 输出描述:
对应每个整数,输出其拆成不同素数和的个数,每个结果占一行。1.3 输入例子:
30 26 20
1.4 输出例子:
3 2 2
2 解题思路
使用暴力计算法进行实现3 算法实现
import java.util.Scanner; /** * Author: 王俊超 * Time: 2016-05-06 15:38 * CSDN: http://blog.csdn.net/derrantcm * Github: https://github.com/Wang-Jun-Chao * Declaration: All Rights Reserved !!! */ public class Main { private final static int NUM = 100_000 + 1; private final static int[] ANS = new int[NUM]; public static void main(String[] args) { init(); Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNext()) { int n = scanner.nextInt(); System.out.println(ANS ); } scanner.close(); } private static void init() { // 标记是否是素数 // false表示是素数 // true表示不是素数 // 下标为0和1的不使用 boolean[] mark = new boolean[NUM]; // 取出[1, NUM]中的所有素数 int[] primes = new int[NUM]; // 记录素数个数 int count = 0; for (int i = 2; i < NUM; i++) { // i是质数 if (!mark[i]) { // 记录素数 primes[count] = i; count++; // 标记不是素数的 for (int j = 2 * i; j < NUM; j += i) { mark[j] = true; } } } // 求[0, NUM]中,每个数字可以用几组素数表示 int v; for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { v = primes[i] + primes[j]; if (v < NUM) { ANS[v]++; } // 已经大于NUM说明后面的数还会大于NUM,所以要退出内层循环 else { break; } } } } }
4 测试结果
5 其它信息
因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】。相关文章推荐
- Java Web用户登录实例代码
- C++ vector 用法
- asp.net中的相关知识
- 解决python画图标签中文乱码
- debian-Python-pip安装失败问题解决
- 【实践派】Java实例的内存占用测试(一)
- 做一个简单的电脑操作界面
- django实现日期分类效果
- Java基础——原码, 反码, 补码 详解
- 利用cgi 实现简易网页加法计算器功能
- 浅谈Java设计模式之策略模式
- NumPy 索引 迭代 Resheap
- java使用Socket实现SMTP协议发送邮件
- JAVA_异常处理
- leetcode #51
- go语言的模板,text/template包
- 一个简单的php路由类
- 编程读取ELF文件头
- min与windef.h
- python 中 list 列表 的十种操作方法:添加,插入,弹出,删除,延长,运算,查找,排序,反转,采用递归函数深度遍历list