您的位置:首页 > 编程语言 > Java开发

java牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛于是想了一个算法题目:在这本算法书页码中0~9每个数字分别出现了多少次?

2017-05-25 16:15 633 查看
参考《编程之美》132页求数字中1的个数

/**
* 牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛于是想了一个算法题目:在这本算法书页码中0~9每个数字分别出现了多少次?
*
* @author pomay
*
*/
import java.util.Scanner;

public class Nowcode_pagecount
{
static int count1to9(int n, int i)
{
int num = 0;
int temp = 1;// 从个位开始
int low = 0; // 记录当前位的低位
int orig = n;

while (n != 0)
{
// 如果当前位数大于这个数
if (n % 10 > i)
{
// (高位+1)x位数
num += (n / 10 + 1) * temp;
// 如果当前位数小于这个数
} else if (n % 10 < i)
{
// 高位*位数
num += (n / 10) * temp;
// 如果当前位数等于这个数
} else
{
// 高位*位数+低位+1
num += (n / 10) * temp + (low + 1);
}
temp *= 10;
low = orig - (orig / temp) * temp;
n /= 10;
}
return num;
}

static int count0(int n)
{
int num = 0;
int temp = 1;
int low = 0;
int orig = n;

while (n != 0)
{
if (n % 10 == 0)
{
num += (n / 10 - 1) * temp + (low + 1);
} else
{
num += (n / 10) * temp;
}
temp *= 10;
low = orig - (orig / temp) * temp;
n /= 10;

}
return num;
}

public static void main(String[] args)
{
// 输入包括一个整数n(1 ≤ n ≤ 1,000,000,000)
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int[] nums = new int[10];
// 方法二:计算1-9的个数和计算0的个数
nums[0] = count0(n);
for (int i = 1; i < 10; i++)
{
nums[i] = count1to9(n, i);
}
for (int i = 0; i < nums.length; i++)
{
if (i < nums.length - 1)
System.out.print(nums[i] + " ");
else
System.out.print(nums[i]);
}
//// 方法一:暴力解法从头开始计算
// for (int i = 1; i <= n; i++)
// {
// // 把页数转换成字符存入数组
// char[] c = String.valueOf(i).toCharArray();
// for (int j = 0; j < c.length; j++)
// {
// // 字符转换成整数
// int m = c[j] - '0';
// nums[m] += 1;
// }
// }
// for (int i = 0; i < nums.length; i++)
// {
// if (i < nums.length - 1)
// System.out.print(nums[i] + " ");
// else
// System.out.print(nums[i]);
// }
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐