ACM 寻找单调数

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

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;
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值