Uva1640(统计数字出现的次数)

题意:

统计两个整数a,b之间各个数字(0~9)出现的次数,如1024和1032,他们之间的数字有1024 1025 1026 1027 1028 1029 1030 1031 1032 总共有10个0,10个1,3个3等等。

解法:

这类问题的一般步骤都是先用f(n,d)计算出0~n中d数字出现的次数,那么答案就是f(b,d)-f(a-1,d)

下面程序中的注释为(1,2974)的第一层(未递归)解释,递归后同理

1-2974 拆分为1-2970  和 2971-2974

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 int l, r;
 6 int a[11], b[11];
 7
 8 void solve(int n, int m) {
 9     int x = n / 10;//除了末位以外的                     x=297
10     int y = n % 10;//最后一位的数字范围                  y=4
11     int tmp = x;
12     //计算小于10*x+1到10*x+y中个位数的个数,b[1-y]也就是(2971-2974)个位数
13     for (int i = 1; i <= y; i++)b[i] += m;
14     //计算10*x-10到10*x-1中个位数的总个数,296 0-296 9 个位数个数每个都是296个
15     for (int i = 0; i <= 9; i++)b[i] += m*x;
16     while (tmp) {
17     //10*x 到10*x+y非个位的个数,因为从0开始,所以*(y+1)就是非个位位数,当然还要乘m
18         b[tmp % 10] += m*(y + 1);
19         tmp /= 10;
20     }
21     if (x) solve(x - 1, m * 10);
22 }
23
24 int main() {
25     while (cin >> l >> r && (l || r)) {
26         memset(b, 0, sizeof(b));
27         if (l > r)swap(l, r);
28         solve(l - 1, 1);
29         for (int i = 0; i <= 9; i++)a[i] = b[i], b[i] = 0;
30         solve(r, 1);
31         cout << b[0] - a[0];
32         for (int i = 1; i <= 9; i++)cout << " " << b[i] - a[i];
33         cout << endl;
34     }
35     return 0;
36 }

原文地址:https://www.cnblogs.com/romaLzhih/p/9515195.html

时间: 2024-10-07 17:06:59

Uva1640(统计数字出现的次数)的相关文章

腾讯面试题(统计数字出现的次数问题)

时间:2014.04.28 地点:基地二楼 日志:知道自己没有尝试着去试图改变,晓得错了~~ ---------------------------------------------------------------- 一.题目: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数. 上排的十个数如下: [0,1,2,3,4,5,6,7,8,9] 举一个例子, 数值:0,1,2,3,4,5,6,7,8,9 分配:6,2,1,0,

统计数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数: 可定义一个用于统计数字个数的变量count,然后从前往后遍历数组,看是否与所求数字相等,如果相等,则count++: 下面贴出代码: public class Solution {     public int GetNumberOfK(int [] array , int k) {         int count = 0;        for(int i=0;i<array.length;i++){            if(array[i]==k

统计每个数字出现的次数。

题目描述:一个数组大小N,由0到N-1之间的数组组成,或重复,或不存在,请统计每个数字出现的次数. #include<iostream> using namespace std; //借用辅助空间,不破坏原数组(空间换时间) void ParseArr(int *a, int l,int *b) { for(int i=0;i<l;++i) { b[a[i]%l]++; } } //在原数组上面进行记录(时间换空间) void parseArr(int arr[], int n) { f

【C语言】统计数组中出现次数超过一半的数字

//统计数组中出现次数超过一半的数字 #include <stdio.h> int Find(int *arr, int len) { int num = 0; //当前数字 int times = 0; //当前数字出现的次数 int i = 0; for (i = 0; i<len; i++) { if (times == 0) { num = arr[i]; times = 1; } else if (arr[i] == num) times++; else times--; }

统计数字noip2007

7909:统计数字 总时间限制:  1000ms 内存限制:  65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入 包含n+1行:第一行是整数n,表示自然数的个数:第2~n+1每行一个自然数. 40%的数据满足:1<=n<=1000:80%的数据满足:1<=n<=50000:100%的数据满足:1<=n

统计数字问题

问题描述: 一本书的页码从自然数1开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如第6页用6表示而不是06或006. 数字统计问题要求对给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9. 算法分析: 比如,对于一个数字34567,我们可以这样来计算从1到34567之间所有数字中每个数字出现的次数:从0到9999,这个区间的每个数字的出现次数可以使用原著中给出的递推公式,即每个数字出现4000次. 从10000到19999

7909:统计数字

7909:统计数字 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入 包含n+1行:第一行是整数n,表示自然数的个数:第2~n+1每行一个自然数. 40%的数据满足:1<=n<=1000:80%的数据满足:1<=n<=50000:100%的

1164 统计数字

1164 统计数字 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description [问题描述]某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入描述 Input Description 第1行是整数n,表示自然数的个数.第2~n+1 行每行一个自

Excel中COUNTIFS函数统计词频个数出现次数

Excel中COUNTIFS函数统计词频个数出现次数 在Excel中经常需要实现如下需求:在某一列单元格中有不同的词语,有些词语相同,有的不同(如图1所示).需要统计Excel表格中每个词语出现的个数,即相当于统计词频出现次数. 图1. Excel表格统计个数 解决方法:采用COUNTIFS函数. COUNTIFS 函数语法及格式:COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2]…)其中,criteria_rang