自然数

洛谷P1036 选数--java实现

三世轮回 提交于 2019-11-25 19:34:30
这题用递归实在做不出来了,还是copy一下题解吧。 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数nn): 先输入一个自然数nn(n \le 1000n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能超过原数的一半; 加上数后,继续按此规则进行处理,直到不能再加自然数为止. 输入格式 11个自然数nn(n \le 1000n≤1000) 输出格式 11个整数,表示具有该性质数的个数。 输入输出样例 输入 #1复制 6 输出 #1复制 6 说明/提示 满足条件的数为 6,16,26,126,36,136 import java . util . * ; public class Main { private static int num ; private static int [ ] a = new int [ 22 ] ; private static int [ ] number = new int [ 15000010 ] ; //质数表 public static void init ( ) { for ( int i = 2 ; i < 15000010 ; i ++ ) { if ( number [ i ] == 0 ) { //0为质数 for ( int j = i + i ; j <

5-3 自然数的拆分 (20 分)

ⅰ亾dé卋堺 提交于 2019-11-25 19:24:27
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。 当n=7共14种拆分方法: 7=1+1+1+1+1+1+1 7=1+1+1+1+1+2 7=1+1+1+1+3 7=1+1+1+2+2 7=1+1+1+4 7=1+1+2+3 7=1+1+5 7=1+2+2+2 7=1+2+4 7=1+3+3 7=1+6 7=2+2+3 7=2+5 7=3+4 输入格式: 输入n, 1<n<20。 输出格式: 按字典序输出具体的方案。 输入样例: 在这里给出一组输入。例如: 7 输出样例: 7=1+1+1+1+1+1+1 7=1+1+1+1+1+2 7=1+1+1+1+3 7=1+1+1+2+2 7=1+1+1+4 7=1+1+2+3 7=1+1+5 7=1+2+2+2 7=1+2+4 7=1+3+3 7=1+6 7=2+2+3 7=2+5 7=3+4 这里我们同样采用回溯法;每个结点优先从1开始减去当前剩余数,减数优先级递减直到n-1结束;随后判断是否可减;当出现余数既不为0又小于当前减数时则判断不可减,减去当前分支;具体算法如下: package 宿題; import java.io.*; public class PTASplittingNumbers {   static int A;   public static void main(String args[]