题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
分析:
方法1:不考虑时间效率的解法,通过对10求余判断个位数是否是1,若大于10就除以10之后再求余.
方法2:将这n个数转换成字符串数组,然后对每个字符串的每个字符进行判断是否等于‘1’,若等于的话就将计数器加1,直到遍历完所有的数为止。
代码如下:
package problem2;
import java.util.Scanner;
/**
* @author Hutongling
*
* @time:2017年3月27日 上午11:28:09
*/
public class 从1到n整数中1出现的次数 {
//最笨的方法:一个一个计算
static void numberOf1From1ToN(int n){
long t1=System.currentTimeMillis();
int number=0;
for(int i=1;i<=n;i++)
number+=numberOf1(i);
long t2=System.currentTimeMillis();
System.out.println("方法1:一共有" + number + "个1");
System.out.println("一共耗时" + (t2-t1) + "毫秒");;
}
static int numberOf1(int n){
int number=0;
while(n>0){
if(n%10==1)
number++;
n=n/10;
}
return number;
}
//方法2:将数转换成字符串,然后在字符串中找‘1’
static void find1From1ToN(int n){
int count=0;
long t1=System.currentTimeMillis();
for(int i=1;i<=n;i++){
char[] temp=Integer.toString(i).toCharArray();
for(int j=0;j<temp.length;j++){
if(temp[j]=='1')
count++;
}
}
long t2=System.currentTimeMillis();
System.out.println("方法2:一共有" + count + "个1");
System.out.println("一共耗时" + (t2-t1) + "毫秒");
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
numberOf1From1ToN(n);
find1From1ToN(n);
}
}
}
代码结果:
100
方法1:一共有21个1
一共耗时0毫秒
方法2:一共有21个1
一共耗时1毫秒
1000
方法1:一共有301个1
一共耗时0毫秒
方法2:一共有301个1
一共耗时1毫秒
10000
方法1:一共有4001个1
一共耗时0毫秒
方法2:一共有4001个1
一共耗时2毫秒
100000
方法1:一共有50001个1
一共耗时2毫秒
方法2:一共有50001个1
一共耗时9毫秒
1000000
方法1:一共有600001个1
一共耗时11毫秒
方法2:一共有600001个1
一共耗时41毫秒
10000000
方法1:一共有7000001个1
一共耗时98毫秒
方法2:一共有7000001个1
一共耗时383毫秒
100000000
方法1:一共有80000001个1
一共耗时1091毫秒
方法2:一共有80000001个1
一共耗时3490毫秒
1000000000
方法1:一共有900000001个1
一共耗时15246毫秒
方法2:一共有900000001个1
一共耗时35596毫秒
结果发现第一种方法比第二种方法快,估计是因为需要将数转换成字符串需要不少的时间才导致第二个方法变慢的。