挑战2

fuyun 2009-08-25
描述:
    挑战1的逆过程,传入一整型或只包含数字的字符串型参数(任意长度),该数表示从1到某数的每数位数之和,求解某数.(不能用枚举法)如果传入的给定数不能求解出某数,需要指出某数处于的最小整数区间.

例子:
    1.输入:8
      输出:8
    2.输入:171
      输出:90
    3.输入:2592
      输出:900
    4.输入:2600
      输出:(902,903).因为902->2598,903->2601,而2598 < 2600 < 2601(符号->表示对应关系)
suntao19830709 2010-12-31
分析:
假定输入的数为给定值,输出值为目标值
根据分析,不难看出:
长度为1的数有1-9,共9个数
长度为2的数有10-99,共90个数
长度为3的数有100-999,共900个数,类推
因此可以设定一个i,来代表所有长度为i或小于i的数之和,称为阀值,通过比较给定值和这个阀值,可以确定目标值的位数。
假定i位的整数里,最大值是max,那么阀值给定值的差值,再除以i这个位数,应该就是max目标值的差值。
如果上述差值除以i有余数,说明是题目中4的情况。稍微调整一下。
因此,大致的java算法如下(未考虑n小于1的情况,读者自己加吧):
public String getN(int n){
		int i = 1;
		long total = Math.round(9 * Math.pow(10, i - 1));
		while(n > total){
			i++;
			total += i * Math.round(9 * Math.pow(10, i - 1));
		}
		long max = Math.round(Math.pow(10, i)) - 1;
		long result = max - ((total - n)/i);
		if((total - n) % i == 0 ){
			return String.valueOf(result) ;
		}
		return String.valueOf(result-1) + "," + String.valueOf(result);
	}
Global site tag (gtag.js) - Google Analytics