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]);
// }
}
}
/**
* 牛牛新买了一本算法书,算法书一共有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]);
// }
}
}
相关文章推荐
- 一本书n页的页码连续编号,则数字0到9在页码中各出现多少次?用c++编程
- 1、在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。设计一个算法,找出出现次数最多的数字。
- JAVA算法题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
- java读取txt文件,并统计每行中每个字母出现的次数,并将产生的数字保存到一个新的txt文件中(有加分)
- 统计页码数字0~9分别出现了多少次
- 提高篇——统计字符串中每个小字母分别出现多少次?
- 算法题:从数组找数字(网易2017校园招聘) 2017-10-10 算法爱好者 (点击上方公众号,可快速关注) 给定一个数组,除了一个数出现 1 次之外,其余数都出现 3 次。找出出现一次的数。
- java读写应用(为了舒适的阅读小说,将一个2Mtxt文档中的小说的每个章节抽取出来分别放在html文件中)
- 算法题目---数组中出现次数超过一半的数字
- 一个简单的算法---实现找出数组中一个数字出现次数最多的数字
- 算法题目---数组只出现一次数字
- 用java编写一个函数,统计一个字符串中每个字母出现的次数
- 【leetcode】【Single Number题目】java 异或运算解决数字出现偶数次还是奇数次问题||HashMap
- 【算法习作】已知有一个数字在某数组中出现次数超过一半,求这个数
- 统计数字问题。给定一本书,其中包含n页,计算出书的全部页码中用到了多少个数字0…9。
- 计算数组中每个数字出现多少次--“Bucket”桶的思想
- java一个算法题:输出一个字符串中出现次数最多的字符,以及次数
- 一个数组arr,长度为N,N小于10^8,里面数字的范围是1~N,求每个数字出现的次数
- 从一到十九共十九个数,打印出利用这十九个整数任意多个相加等于20所以可能性,每个数字在同一个算式中只出现一次.
- java查找一组数中每个数字出现的次数