统计0-n之间0-9出现的次数

这个题有很多的姿势,准备pat考试的时候再次遇到这个题目,数位相关的题目都是划分区间,然后进行统计

因为需要统计0,从高位向地位划分的时候会受到前导0的干扰,想起以前从低位开始划分的方法,简单的介绍下

比如1234,将区间划分为0-1230 1231-1234,两个区间,第二个区间显然很好求,为了递归的顺利进行,

void dfs(int n, int m){
    if(-1 == n)  return ;
    int x = n / 10;
    int y = n % 10;
    for(int i = 1; i <= y; ++i)  ans[i] +=m;
    int tmp = x;
    while(tmp){
        ans[tmp%10] +=(y+1) * m;
        tmp /= 10;    }//上面统计的是1230-1234,1230的0是在下面补的
  for(int i = 0; i < 10; ++i)  ans[i] +=m*x;//122*,的个位
  dfs(x-1, m*10); }

  

时间: 2024-10-11 18:41:14

统计0-n之间0-9出现的次数的相关文章

52.从键盘上输入若干学生成绩(成绩在0~100之间),计算平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入

//1.建立一个for循环用于输入数据,设置退出条件 //2.算出平均成绩 #include<iostream> using namespace std; int main() { int Score,sum=0,k=0; int a[100]; float Average; cout<<"please input some students's score:"<<endl; for(int i=0;i<100;i++) { cin>&g

C语言 判断0~3000之间的闰年

熟话说"四年一润,百年不润,四百年再润".那么我们来用编程查找闰年吧! #include<stdio.h> int main() { int year,leap=1;  printf("\t\t\t判断0~3000之间的闰年\n");  printf("请输入0~3000之间的年份\n"); flag:  scanf("%d",&year); //输入年份  if(year>0&&ye

统计一个二进制字符串连续出现0或者连续出现1的最大次数

给定一个二进制的字符串,统计连续出现0或者连续出现1的最大次数. 由于需要取出最大次数,所以一旦出现连续0的时候,需要将代表出现连续1的变量置清空,反之亦然. 还需要注意的是,我们要将每次连续出现0和1的次数各自用变量保存起来.详细代码如下:

js 数组排序要注意的问题,返回的值最好为 -1, 0, 1之间的值

var test10Elements = [7, 6, 5, 4, 3, 2, 1, 0, 8, 9]; var comparefn = function (x, y) { return x - y; }; test10Elements.sort(comparefn); var comparefn2 = function (x, y) { return x > y; }; test10Elements.sort(comparefn2); http://w3help.org/zh-cn/cause

100万个数据,数据值在0~65535之间,请用尽可能少的内存和最快的速度从小到大排序

场景说明:100万个数据,数据值在0~65535之间,请用尽可能少的内存和最快的速度从小到大排序 voidsort(int* array, int n) { //n的值在100万左右 //你的实现 } 我们首先观察到所有的数据已经保存到了array数组中,现在我们需要做的就是将数组中的元素排序.现在我们把数组中的元素提取出来比如是3,然后我们提取出数组下标是3的元素,保存到临时空间,通过负数来计算个数: void sort(int* array, int n) {     int tmp=0;

关于cocos2d-x3.0和2.0之间的区别

区别1.去CC 之前2.0的CC**,把CC都去掉,基本的元素都是保留的 2.0 CCSprite CCCallFunc CCNode .. 3.0 Sprite CallFunc Node .. 区别2.cc***结构体改变 2.0 ccp(x,y) ccpAdd(p1,p2) ccpSub ccpMult ccpLength(p) ccpDot(p1,p2); ccc3() ccc4() ccWHITE CCPointZero CCSizeZero 3.0 Point(x,y) p1+p2;

ToString(“N2”)和ToString(“0.00”)之间的区别

看来N会包含数千个分隔符,而0.00则不会. N2将以500.00的方式工作,但是当您有5000.00时,N2将显示为 5,000.00 代替 5000.00 If you do this instead: 0.ToString("0.##"); you get: 0 Interestingly, if you do this: 0.ToString("#.0#"); you get: .0 If you want all three digits: 0.ToStr

生成0~9之间不重复的随机数

int main(void) { int m[9] = { 0 }; int flag = 0; srand(time(0)); for (int i = 0; i < 9; i++) { do { flag = 0; m[i] = rand() % 9 + 1; for (int j = 0; j < i; j++) { if (m[j] == m[i]) { flag = 1; } } } while (flag==1); } for (int i = 0; i < 9; i++)

0.0.0.0、127.0.0.1和localhost之间的区别

0.0.0.0和127.0.0.1共同点: 都属于特殊地址. 都属于A类地址. 都是IPV4地址. 区别: 在服务器中,0.0.0.0指的是本机上的所有IPV4地址,,如果我绑定的端口指定了0.0.0.0,那么通过内网地址或外网地址都可以访问我的应用.但是如果我只绑定了内网地址,那么通过外网地址就不能访问,所以如果绑定0.0.0.0,也有一定安全隐患,对于只需要内网访问的服务,可以只绑定内网地址. 在路由中,0.0.0.0表示的是默认路由,即当路由表中完全没有找到完全匹配的路由的时候所对应的路由

编程题:统计1~20之间不能被3整除的数的个数并输出这些数

以下程序是用break和continue语句来实现的. #include<stdio.h> void main() { int n,s; for(n=1,s=0;n<=20;n=n+1) { if(n%3==0) continue; printf("%d\t",n); s=s+1; } printf("\ntotal:%d\n",s); } 算法分析与流程图: 运行结果: 编程题:统计1~20之间不能被3整除的数的个数并输出这些数,布布扣,bubu