给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

一、题目:

n给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

n要求:

n写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。

n在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

二、解题思路:

无。

三、程序源码:

import java.util.*;
public class main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int num;
        Scanner S=new Scanner(System.in);
        System.out.print("请输入数字:");
        num=S.nextInt();
        System.out.print(num+"中出现数字1的个数为:");
        System.out.println(Count(num));
        for(int i=32767;i>0;i++)
        {
            if(Count(i)==i)
            {
                System.out.print("满足条件的“f(N) =N”的最大的N是"+i);
                break;
            }
        }
    }
    static int Count(int n)
    {
        int count=0;
        int factor=1;
        int LowerNum=0;
        int CurNum=0;
        int HigherNum=0;
        while (n/factor!=0)
        {
            LowerNum=n-(n/factor)*factor;
            CurNum=(n/factor)%10;
            HigherNum=n/(factor*10);
            switch (CurNum)
            {
            case 0:
                count=count+HigherNum*factor;
                break;
            case 1:
                count=count+HigherNum*factor + LowerNum +1;
                break;
            default:
                count=count+(HigherNum+1)*factor;
                break;
            }
            factor=factor*10;
        }
        return count;
    }

}

四、程序运行截图:

五、个人总结:

这次程序自己首先想到的是把1—N的每个数里边的1数一遍。但这不是最有效的办法,自己想的方法又实现不出来,在网上找了好多资料,只有上面的这种方法自己可以理解,因此就抄袭了下来。这个程序是根据如下规律写出来的:

1.一位十进制数:当N>=1时,f(N)=1;当N=0时,f(N)= 0;

   2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;

          f(23)=个位出现1的个数+十位出现1的个数=3+10=13;

          ......

          f(93)=个位出现1的个数+十位出现1的个数=10+10=20;

   3.三位十进制数:f(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=13+20+24=57;

   4.f(abcde),计算c位上的1的个数,需要看ab、c、de的情况:

   当c=0时,受高位影响,百位上出现1的个数为:(ab)*100

   当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1)

   当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100

自己理解的不是很到位,但是可以明白基本的意思,对自己无语。

时间: 2024-12-17 19:33:52

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。的相关文章

课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

一.题目 1 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 2 要求: (1) 写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. (2)在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.设计思想 (1)一位数时 f(0)=0;f(1)=1;f(2-9)=1; (2)二位数时 f(10)=1+(0+1)=2; f(11)=(1+1)+(1+1)=4; f(12)=(1+1)+(2+1)=5;

【转自韩寒one一个】口罩,写下自己的思考

我高一的数学老师就坐在我对面,我是通过他认识他儿子的.1994年我高一,那时上海还没有地铁.第一条地铁1号线是1995年4月10日正式运营的.高中那些日子里,我沉默寡言,蘑菇头,和现在差不多高.数学老师在自修课上看守着我们,总是一副瞌睡的神态.他儿子那时不在我们班,但串起教室来自然大方.有一次,男孩十分怜悯地看着我解题,突然说,我来.然后洋洋洒洒,这给了我一种智力上的逼迫感.他最喜欢做证明题,细细分解,好像那样才能理解事物,到达根本.我问他,你将来想干什么.他说,不会和学校里那些男老师一样,他只

给定一个十进制数,将其转化为N进制数-----17年滴滴笔试题

题目:给定一个十进制数M,将其转化为N进制数,其中2<=N<=16,其中N为32为整型数; 输入:M N,如7 2 输出转化结果:111 注意点:考虑负数的情况,记得添加负号: 思路:1. 使用一个辅助栈来存放M对N取余的结果(M%N):   2. 处理余数<=9和>9两种情况,因为按照16进制,>9的数用ABCDEF取代   3. 再更新取余后M的取值:M=M/N:   4. 循环处理2,3两个步骤,直到M=0: 5. 处理最终结果,出栈,直到栈为空: 代码如下: pack

给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

1 """ 2 #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 3 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 4 解题思路: 5 1.设定一个空字典,去存储列表中的值和值出现的次数 6 2.使用L.count()方法可以统计出L中值出现的次数 7 3.使用sorted方法可以进行排序,sorted(iterable,key,reverse) 8 注意key是函数 9 4.列表中的元祖取值 d[i][j] i是哪一个元祖,j是元祖

给定一个十进制数M,以及需要转换的进制数N。 将十进制数M转化为N进制数

输入描述: 输入为一行,M(32位整数).N(2 ≤ N ≤** 16),以空格隔开. 输出描述: 为每个测试实例输出转换后的数,每个输出占一行. 如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等) 输入例子: 7 2 输出例子: 111 import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util

python_exercise_给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

# 设定给出的非空数组为list_a,如下list_a = [8,1,3,5,1,2,45,8,5,7,7,8,8,8,8,8,8,5,5] # 将list_a去重,留下唯一值list_a_set = set(list_a) # 将list_a去重后的值作为字典的key放到字典中list_a_dict = {x:None for x in list_a_set} # 遍历将list_a去重后的唯一值,统计唯一值出现的次数.把次数作为字典的value放到字典中for l in list_a_set

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。编写一个函数实现上述功能,在主函数中输入n个整数,并输出调整后的n个数

第一种方法:指针法 #include<stdio.h> #include<stdlib.h> int  w(int *d,int e,int g) { int i,j,t; int *r; j=0; for(i=0;i<g;i++) { t=*(d+i); *(d+i)=*(d+e-g+j); *(d+e-g+j)=t; j++; } return *d; } int main() { int a[100]; int i,j,k,n,m; scanf("%d%d&q

十进制的正整数,其中出现“1”的个数

一.题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数. 例如 f(12) = 5. 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.解题思路: 通过对几个特定数的分析,寻找规律,比如:“10”=1+1:“13”=2+4:“123”=3+1+53…… 先将个位上的“1”算出,再算十位上的“1”,最后再算出百位上的“1”,然后再加起来即可. 三.C++代

找出十进制数中出现的&#39;&#39;一&#39;&#39;的个数

一.题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.解决思路 通过列举几个数进行计算,可以发现函数f(N)规律如下: 1.一位十进制数:当N>=1时,f(N)=1:当N=0时,f(N)= 0; 2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4