【编程题目】在从 1 到 n 的正数中 1 出现的次数

30.在从 1 到 n 的正数中 1 出现的次数(数组)
题目:输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数。
例如输入 12,从 1 到 12 这些整数中包含 1 的数字有 1, 10, 1 1 和 12, 1 一共出现了 5 次。

思路:
如1121
判断 千位 1出现了多少次:10000 有 0 个 有0个完整的 1000次千位 1, 千位数为1,说明本次千位还没有走完 后面的数字为 121 说明本次千位1走了 122个
判断 百位 1出现了多少次:1000 有 1 个 有1个完整的 100次百位 1, 百位数为1,说明本次百位还没有走完 后面的数字为 21 说明本次百位1走了 22个
判断 十位 1出现了多少次:100 有 11 个 有11个完整的 10次十位 1, 十位数为2,说明本次十位走完了 再加10个1
判断 个位 1出现了多少次:10 有 112 个 有112个完整的 1次十位 1, 个位数为2,说明本次个位走完了 再加1个1
共有 122 + 100 * 1 + 22 + 10 * 11 + 10 + 1 * 112 + 1 个1

#include <stdio.h>
#include <math.h>

int getNumofOne(int N)
{
    int num = 0; //1出现的次数

    int surplus = 0; //对于每一位数字剩余的部分
    int times = 1;
    for(times = 0; N / int(pow(10.0, times)) != 0; times++)
    {
        surplus = N % int(pow(10.0, times + 1));
        num += (N /int(pow(10.0, times + 1))) * int(pow(10.0, times)); //一定要舍弃小数点后的数字
        if ((surplus / int(pow(10.0, times))) > 1)
        {
            num += int(pow(10.0, times));
        }
        else if((surplus / int(pow(10.0, times))) == 1)
        {
            num += surplus % int(pow(10.0, times)) + 1;
        }
    }

    return num;
}

int main()
{

    int n = getNumofOne(12);
    return 0;
}

网上看答案,发现大家的思路跟我的都是一样的就是具体的实现过程不大相同。他们有一个共同的特点就是没有用pow函数,值得学习!

http://www.cnblogs.com/GoAhead/archive/2012/05/28/2521415.html 中的实现

#include <stdio.h>
int test(int a){
    int i;
    int num=1;
    if(a==0)
        return 1;
    for(i=1;i<=a;i++)
        num*=10;
    return num;
 }
int function(int a){
    int p=a;
    int num=0;
    int N=0;
    int temp;
    int i;
    while(p!=0)
    {
        p=p/10;
        N++;
    }
    p=a;
    for(i=1;i<=N;i++){
        num+=p/test(i)*test(i-1);
        temp=a/test(i-1)%10;
        if(temp==1)
            num+=a%test(i-1)+1;
        if(temp>1)
            num+=test(i-1);
    }
    return num;
}

void main(){
    printf("%d\n",function(88888));
}

http://blog.csdn.net/zz198808/article/details/7588335 里的实现

// 1Count.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;

LONGLONG Sum1s( ULONGLONG n )
{
    ULONGLONG iCount = 0;
    ULONGLONG iFactor = 1;

    ULONGLONG iLowerNum = 0;
    ULONGLONG iCurrNum = 0;
    ULONGLONG iHigherNum = 0;

    while( n / iFactor != 0 )
    {
        iLowerNum = n - ( n / iFactor ) * iFactor;
        iCurrNum = (n / iFactor ) % 10;
        iHigherNum = n / ( iFactor *10 );

        switch( iCurrNum )
        {
        case 0:
            iCount += iHigherNum * iFactor;
            break;
        case 1:
            iCount += iHigherNum * iFactor + iLowerNum + 1;
            break;
        default:
            iCount += ( iHigherNum + 1 ) * iFactor;
            break;
        }

        iFactor *= 10;
    }
    return iCount;
}

int main()
{
    cout << Sum1s(123)<<endl;
    system("pause");
    return 0;
}

【编程题目】在从 1 到 n 的正数中 1 出现的次数

时间: 2024-11-06 11:21:03

【编程题目】在从 1 到 n 的正数中 1 出现的次数的相关文章

【目录】编程题目

编程题目 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1) 一个数组是由一个递减数列左移若干位形成的,在这种数组中查找某一个数.☆ 请修改 append 函数,利用这个函数实现两个非降序链表的并集 一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短. 求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边, 有向图不再连通 有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前

【编程题目】n 个骰子的点数

67.俩个闲玩娱乐(运算).2.n 个骰子的点数.把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n,打印出 S 的所有可能的值出现的概率. 思路:用递归把每个骰子的可能情况变量,记录各种和S出现的次数 比上 总情况数就是概率 /* 67.俩个闲玩娱乐(运算). 2.n 个骰子的点数. 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n, 打印出 S 的所有可能的值出现的概率. */ #include <stdio.h> #include <stdlib.

【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[100,99,98,1,2,3];var b=[1,2,3,4,5,40]; 首先,目标一定是先找到n个数字,使得数字和比总和的一半小,但是最接近. 思路一:开始看这道题跟之前学的动态规划很像,就想用动态规划来解.但是....做不出来........... 必须要选一半的数字让我头都大了. 思路二:

【编程题目】判断整数序列是不是二元查找树的后序遍历结果,如果是,构建该二元查找树

判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回 true,否则返回 false.例如输入 5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回 true.如果输入 7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false. 做这个题目的时候最开始傻了,想着从前到后根据数字的大小关系判断.后来幡然醒悟,根据后序遍历的特点.序列最后一

【编程题目】扑克牌的顺子

67.俩个闲玩娱乐(运算).1.扑克牌的顺子从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的.2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字. 思路: 用min.max记录输入的牌对应的数字大小,不考虑王,用wnum记录王的个数, record[13]记录每种牌是否出现过.设要判断n个牌是否连续 只要  出现不重复 且(max - min + 1) 在 [ n - wnum , n ]之间即可 /* 67.俩个闲玩娱

火车调度-c#求解-英雄会在线编程题目

题目: 火车调度 返回首页 发布公司: 有 效 期: 赛 区: CSDN 2014-04-30至2015-04-30 北京 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Java C# 题目详情 火车从A地和B地之间运行,你知道火车从某地出发的时间和到达某地的时间(这个时间出发,一定这个时候到达).火车到达目的地后,不能立刻返回,需要经过t分钟检修才可以返回.列车只在A.B两地运行.你知道每天内的时刻表,求A,B两地各需要存放多少辆列车,才能满足这个时刻表?即只要该

另类编辑距离-c#求解-英雄会在线编程题目

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var C

【编程题目】颠倒栈☆

66.颠倒栈(栈).题目:用递归颠倒一个栈.例如输入栈{1, 2, 3, 4, 5},1 在栈顶.颠倒之后的栈为{5, 4, 3, 2, 1},5 处在栈顶. 思路:我自己没做出来,因为总觉得用不上递归.看了网上答案http://blog.csdn.net/cxllyg/article/details/7655935 根据里面的思路 自己照着写了一遍 /* 66.颠倒栈(栈). 题目:用递归颠倒一个栈.例如输入栈{1, 2, 3, 4, 5},1 在栈顶. 颠倒之后的栈为{5, 4, 3, 2,

【编程题目】对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一

45.雅虎(运算.矩阵):1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到. 这道题,是我目前为止做过的最最最最最麻烦.最繁琐的题目了. 思路: 把输入的矩阵一步步还原成 0 矩阵 一个数字,只可能伴随着它上下左右四个方向的数字变化. ①如果数字比它周围四个数的和要大,那么一定不满足条件. ②如果数字小于等于四周的数字和,且其四周仅有一个数字不为0: 不为0的那个周围数字的大小 -=