一、题目
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。
例如 f(12) = 5。 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二、设计思想
对于这道题目,输入一个正整数,返回从1开始到这个数之间出现过的所有“1”的个数,我的思路是这样的,
1、先要将这个数是几位数得出来;
2、用一个for 循环将数字中德每一位存到数组中,以备后面使用;
3、因为要得到总的1的个数,分别计算个位、最高位、和其它位的1的个数;
4、最后将所有的求和。
三、设计代码
1 import java.util.*; 2 3 class ZhaoYi 4 { 5 public static void main(String[] args) 6 { 7 System.out.print("请输入一个正整数:"); 8 Scanner sc = new Scanner(System.in); 9 int num = sc.nextInt(); 10 11 int m = zhaoYi(num); //12 System.out.println("从1到该数字之间出现“1”的次数是:"+m+"次"); 13 14 }15 public static int weiShu(int b) //可以得到输入的数字的位数16 {17 int temp = 0;18 for (int i=1;i<32 ;i++ )19 {20 if (b/((int)Math.pow(10,i))==0)21 {22 temp = i;23 break;24 }25 }26 return temp;27 }28 29 public static int zhaoYi(int a) //出现1的个数30 {31 int[] arr = new int[32];//一个32位的数组32 int[] sum = new int[32];//一个32位的数组,用来求和33 //int weiShu = 0;34 int SUM = 0; //初始化最后的求和数 35 int n = a; //转移36 int ws = weiShu(a); //得到输入数的位数37 38 for (int i=0;i
四、结果截图
五、心得体会
这次实验的思路比较明确,就是要将输入的数字的 每一位出现的1的个数得到,通过分析规律,将每一位出现1的个数,加起来,最后的到总和。每一位上的情况都能划分成是0,是1,和其余的数的区别,不过在编写的时候,也遇到了一点错误,就是在得到数的位数的时候,一直没能成功,其实这是一个非常简单的问题,最后也解决了。