1到整数n中 出现1的次数,分,最高位,非最高位,两次数相加。递归位数减1.

22 篇文章 0 订阅
11 篇文章 0 订阅

题目描述:

亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数

输入:

输入有多组数据,每组测试数据为一行。

每一行有两个整数a,b(0<=a,b<=1,000,000,000)。

输出:

对应每个测试案例,输出a和b之间1出现的次数。

样例输入:
0 5
1 13
21 55
31 99
样例输出:
1
6
4
7

解题思路:

  这道题目要注意几个问题:

  第一个,比如10 到15 出现几个1?是7个...数字10 12 13 14 15各出现一次,11出现两次,因此是7次

  第二个,输入的两个数,第一个数,可能比第二个大因此如果第一个数大于第二个数要进行一次调整。

    if(n>m)
            swap(&n,&m);

  第三个,就是这道题的主要思想。

  主要思想,通过递归来求解。我们分别求出两个数含有1的个数,但是要注意,对小的的数求解时,要减1.因为如果是10到15,0到10应该含有2个1,而0到15含有8个1,如果直接相减,10的那个1就被减掉了。因此要减1求解。

     char numN[MAXSIZE];
        char numM[MAXSIZE];
        sprintf(numN,"%d",n-1);
        sprintf(numM,"%d",m);
        numberOfN = getNumber(numN);
        numberOfM = getNumber(numM);
        printf("%d\n",numberOfM-numberOfN);

  算法主要思想,首先我们看最高位把数分解,abcde就分解成 1到bcdebcde+1到abcde 两段。比如,34567分解成1到4567,,4568到34567.这样求解第2段,只需要考虑第一位,和后面几位的普通情况就行了。然后递归求第1段

最高位case1:如果最高位是大于1的数。那么就包含1的情况,和1以外的情况。应该就是后面的个个位数为1其他位随机的数目。即,first*(length-1)*power(length-2),后面的(length-1)位为1,剩余(length-2)位0到9随机共10种。即在本例中为2*4*1000种,即11000,11001,11002,11003...21000,21002,21003,21004...即每一位为1*其他几位的随机数。此处就是4*1000.

最高位case2:对于最高位是1的,后面无论是什么都满足情况。因此,如果高位刚好等于1,那么满足的情况更应该是后面的数字之和。

举个例子,    

numF = 0;

if(firstNum > 1)
        numF = power(length-1);//如22345,最高位大于1时,满足的情况为10000-19999,即10000种.
 elseif(firstNum == 1)
        numF = atoi(num+1)+1;//如12345,最高位为等于1时,满足的情况为2345种(不考虑后面的).        
int getNumber(const char *num){
    int firstNum = *num-'0';//字符转数字
    int length = strlen(num);
    int numF,numOther,numL;
    if(!num || *num < '0' || *num > '9' || *num == '\0')l
        return0;
    if(length == 1 && firstNum == 0)
        return0;
    if(length == 1 && firstNum > 0)
        return1;

    numF = 0;
    if(firstNum > 1)
        numF = power(length-1);
    elseif(firstNum == 1)
        numF = atoi(num+1)+1;

    numOther = firstNum*(length-1)*power(length-2);

    numL = getNumber(num+1);//递归调getNumber
return numF + numOther + numL; }
整理以上代码得 全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 32
int getNumber(constchar *num);
int power(int length);
void swap(int *a,int *b);
int main(){
    int n,m,numberOfN,numberOfM;
    while(scanf("%d %d",&n,&m)!=EOF ){
        if(n>m)
            swap(&n,&m);
        char numN[MAXSIZE];
        char numM[MAXSIZE];
        sprintf(numN,"%d",n-1);
        sprintf(numM,"%d",m);
        numberOfN = getNumber(numN);
        numberOfM = getNumber(numM);
        printf("%d\n",numberOfM-numberOfN);
        //printf("%d\n",n%10 == 1?(numberOfM - numberOfN+1):(numberOfM-numberOfN));
    }
    return0;
}
int getNumber(constchar *num){
    int firstNum = *num-'0';
    int length = strlen(num);
    int numF,numOther,numL;
    if(!num || *num < '0' || *num > '9' || *num == '\0')
        return0;
    if(length == 1 && firstNum == 0)
        return0;
    if(length == 1 && firstNum > 0)
        return1;
 
    numF = 0;
    if(firstNum > 1)
        numF = power(length-1);
    elseif(firstNum == 1)
        numF = atoi(num+1)+1;
 
    numOther = firstNum*(length-1)*power(length-2);
 
    numL = getNumber(num+1);
 
    return numF + numOther + numL;
}
int power(int length){
    int i;
    int result = 1;
    for(i=0;i<length;i++){
        result *= 10;
    }
    return result;
}
void swap(int *a,int *b){
    int tmp = *b;
    *b = *a;
    *a = tmp;
}
/**************************************************************
    Problem: 1373
    User: xhalo
    Language: C
    Result: Accepted
    Time:10 ms
    Memory:916 kb
****************************************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境的真实程度。理想的模拟环境应该使用户难以辨真假,使用户全身心地投入到计算机创建的三维虚拟环境,该环境的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值