Description
对于一个正整数X,如果X的每一位都不大于它右边一位上的数字,那么就称为X的递增数,例如: 112 4557 18899 111
类似的,如果x的每一位都不小于它右边一位上的数字,那么就称x为递减数 ,例如 986 6331 77311 111
递增数和递减数统称单调数(111即时递增也是递减,所以也是单调数)
input
有多组测试数据 ,每组数据输入一个正整数n. (n<100)
output
对于每组输入数据中的n,输出小于10的n次方的单调数个数.
Sample input
6
10
sample output
12951
对于一个正整数X,如果X的每一位都不大于它右边一位上的数字,那么就称为X的递增数,例如: 112 4557 18899 111
类似的,如果x的每一位都不小于它右边一位上的数字,那么就称x为递减数 ,例如 986 6331 77311 111
递增数和递减数统称单调数(111即时递增也是递减,所以也是单调数)
input
有多组测试数据 ,每组数据输入一个正整数n. (n<100)
output
对于每组输入数据中的n,输出小于10的n次方的单调数个数.
Sample input
6
10
sample output
12951
277032
import java.util.Scanner;
public class Single {//寻找单调数
int digit;
int[][] inc;
int[][] dec;
public void init() {
inc = new int[digit + 2][10];
dec = new int[digit + 2][10];
for (int a = 1; a < 10; a++) {
inc[1][a] = 1;
dec[1][a] = 1;
}
for (int i = 0; i <= 9; i++) {
if (i < 2) {
inc[2][i] = 9;
} else {
inc[2][i] = 10 - i;
}
}
for (int i = 0; i <= 9; i++) {
dec[2][i] = i;
}
}
public static void main(String[] args) {
Single t = new Single();
Scanner sc = new Scanner(System.in);
t.digit = sc.nextInt();
long t1 = System.currentTimeMillis();
t.init();
System.out.println(t.sum(t.digit));
System.out.println("共用时\t" + (System.currentTimeMillis() - t1));
sc.close();
}
public int incSum(int a, int b) {// a代表位数,b代表末尾数字(a>=3,0=<b<=9)递增数
int cou = 0;
if (a == 0 || a == 1 && b == 0) {
return 0;
}
if (a == 1) {
return 1;
}
if (a == 2) {
return inc[a][b];
}
for (int c = b; c < 10; c++) {
cou = cou + incSum(a - 1, c);
}
return cou + inc[a][b];
}
public int decSum(int a, int b) {// a代表位数,b代表末尾数字(a>=3,0=<b<=9)递减数
int cou = 0;
if (a == 0 || a == 1 && b == 0) {
return 0;
}
if (a == 1) {
return 1;
}
if (a == 2) {
return dec[a][b];
}
for (int c = 0; c <= b; c++) {
cou = cou + decSum(a - 1, c);
}
return cou + dec[a][b];
}
public int sum(int a) {
int temp = 0;
for (int i = 1; i <= a; i++) {
for (int m = 0; m < 10; m++) {
temp = temp + incSum(i, m) + decSum(i, m);
}
}
return temp - a * 9;
}
}