关于求从1数到某个数出现“1”的次数

求有一个数,从1数到这个数出现数字“1”的次数。

不难想象我们可以定义一个方法,可以求一个数出现1的个数。然后从1遍历到要求的数,分别调用我们写的方法,累加起来就实现了我们的目的。

具体代码如下:

package com.jiale.algorithmDay01;



import java.util.Scanner;


public class Demo04 {


public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入一个要计算的整数:");
Scanner s = new Scanner(System.in);
int num = s.nextInt();
int result = f(num);
s.close();
System.out.println("\n计算结果:共出现"+result+"个‘1’。");
}


public static int count_1_AInteger(int num){
int count = 0;
while (num != 0) {
count += (num % 10 == 1)? 1 : 0;
num /= 10;
}
return count;
}

public static int f(int n){
int count = 0;
for (int i = 1; i <= n; i++) {
if (count_1_AInteger(i) != 0) {
System.out.print(i+" ");
}
count += count_1_AInteger(i);
}
return count;
}

}

运算结果:

请输入一个要计算的整数:
20
1 10 11 12 13 14 15 16 17 18 19 
计算结果:共出现12个‘1’。


然而我们发现这样算数目比较小的数还算能应付,但是要算比较大的数比如10000,效率上就完全跟不上了。

于是我们可以采用另一种更明智的方法: 找规律。

具体思路是,从个位起,某一位数固定的话,其他位数出现1的全部可能。然后下一位再考虑。

这样我们不用把每个含有1的数都找出来再统计1的个数了

具体代码如下实现:

package com.jiale.algorithmDay01;


import java.util.Scanner;


public class Demo05 {


public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入一个要计算的整数:");
Scanner s = new Scanner(System.in);
int num = s.nextInt();
int result = fCount_1_ForAInteger(num);
s.close();
System.out.println("计算结果:共出现"+result+"个‘1’。");
}


public static int fCount_1_ForAInteger(int num){
int count = 0;      //用于储存个数
int factor = 1;     //用于循环每一个数位
int lowerNum = 0;   //用于记录比本数位低的剩余数位的数
int currNum = 0;    //用于记录本数位的数字
int higherNum = 0;  //用于记录比本数位高的剩余数位的数

while (num / factor != 0) {
lowerNum = num - (num / factor) * factor;
currNum = (num / factor) % 10;
higherNum = num / (factor * 10);
switch (currNum) {
case 0:
count += higherNum * factor;
break;
case 1:
count += higherNum + factor + lowerNum + 1;
break;
default:
count += (higherNum + 1) * factor;
break;
}
factor *= 10;
}
return count;
}
}

运算结果:

请输入一个要计算的整数:
20
计算结果:共出现12个‘1’。

*由于不用找出每个含有1的数 所以我也不去打印出那些数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值