课堂练习:给定一个十进制的正整数,写下从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;

    f(13)=(1+1)+(3+1)=6;

    f(23)=(2+1)+10=13;

    f(33)=(3+1)+10=14;

    f(93)=(9+1)+10=20;

  (3)三位数时

    f(123)=个位出现的1数+十位出现的1数+百位出现的1数

  (4)N = abcde时

    以c位为例

    if(c==0)  num=ab*100;

    if(c==1)  num=ab*100+de+1;

    if(c>=2)  num=(ab+1)*100

三.源代码

# include <iostream>
using namespace std;
# include <math.h>

int Count1Num(int Digit)
{
    int figure = 1;               //标记计数1的位数
    int curOfDigit = 0;        //当前位数字
    int lowerOfDigit = 0;    //较低位数字
    int higherOfDigit =  0;  //较高位数字
    int count = 0;

    while(Digit / figure != 0)
    {
                                            //取数字
        curOfDigit = (Digit / figure) % 10;
        lowerOfDigit = Digit - (Digit / figure * figure);
        higherOfDigit = Digit / (figure * 10);

        if(Digit <= 0)
            return 0;

        if(0 == curOfDigit)                    //当前数字为0时计数
        {
            count += higherOfDigit * figure;
        }
        else if(1 == curOfDigit)              //当前数字为1时计数
        {
            count += higherOfDigit * figure + lowerOfDigit + 1;
        }
        else
        {
            count += (higherOfDigit+1) * figure;
        }
        figure = figure * 10;                //数字左移一位
    }
    return count;
}

void main()
{
    int Digit;
    int max=0;

    while((cout<<"    需要结束测试请输入0\n请输入要测试的数值(tip:输入自然数):"<<endl)&&(cin>>Digit))
    {
        if(Digit == 0)
            break;

        cout<<"从数字1到数字"<<Digit<<"包含1个数为:"<<Count1Num(Digit)<<endl;
    }
}

四.截图

五.总结

时间: 2024-12-24 21:14:35

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

给定一个十进制的正整数,写下从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 Au

给定一个十进制数,将其转化为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是元祖

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

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

给定一个十进制数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