【蓝桥第一周】计数的梦
来源:互联网 发布:电脑一维码识别软件 编辑:程序博客网 时间:2024/06/04 19:54
RQNOJ PID11 / 计数的梦
题目描述Bessie 处于半梦半醒的状态。过了一会儿,她意识到她好像在数羊,不能入睡。Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码:每一个数码在计数的过程中出现过多少次?
给出两个整数 M 和 N (1 <= M <= N <= 2,000,000,000 以及 N-M <= 500,000),求每一个数码出现了多少次。
例如考虑序列 129..137: 129, 130, 131, 132, 133, 134, 135, 136, 137。统计后发现:
1x0 1x5
10x1 1x6
2x2 1x7
9x3 0x8
1x4 1x9
输入格式
共一行,两个用空格分开的整数 M 和 N
输出格式
共一行,十个用空格分开的整数,分别表示数码(0..9)在序列中出现的次数。
样例输入:
129 137
样例输出:
1 10 2 9 1 1 1 1 0 1
解法一
[解题思路]
因为M和N的取值范围为1 <= M <= N <= 2,000,000,000。所以用long long类型(long long的最大值:9,223,372,036,854,775,807)来存放,通过反复取模、做除法,统计各位数即可。
[代码实现]
#include<iostream>using namespace std;int ans[10];int main(){long long M,N,temp;cin>>M>>N;for(long long i=M;i<=N;i++){temp=i;while(temp){ans[temp%10]++;temp/=10;}}for(int i=0;i<=9;i++)cout<<ans[i]<<" ";return 0;}解法二
[解题思路]
另一种实现方法就是把M,N通过字符串的形式输入,这种方法用于大数之间的运算,操作,这道题可以用高精度减法求出M,N之间的差(即有多少个数,N-M <= 500,000),再用高精度加法,M每次加1,进行统计。
[代码实现]
#include<iostream>#include<string>#include<cmath>using namespace std;int ans[10];int Hps(int Length,int *i_a,int *i_b){/* 该函数实现b-a,并返回sum */for(int i=0;i<Length;i++){ i_b[i]=i_b[i]-i_a[i]; }for (int i=0;i<Length-1;i++) { if(i_b[i]<0) { i_b[i+1]-=1; i_b[i]+=10; } }/* 无意义的0 */int book=0; for (book=Length-1;book>=0;book--) { if(i_b[book]) break; } /* 把数组转为整数 */int sum=0;for(int i=book;i>=0;i--){sum += pow(10,i)*i_b[i];}return sum;}int Hpa(int Length,int *i_a,int i){/* 该函数实现a+i(i<10),并返回book */i_a[0]+=i;/* 进位 */for(int i=0;i<Length;i++){if(i_a[i]>=10){i_a[i]-=10;i_a[i+1]+=1;}}int book=0; for (book=Length-1;book>=0;book--) { if(i_a[book]) break; } return book;}int main(){string a,b;cin>>a>>b;int a_size=a.size();int b_size=b.size();int Length=b.size()+1; /* 因为已知b>a,且相加可能会进一 */int *i_a=new int[Length];int *i_b=new int[Length];/* 初始化 */for (int i=0;i<Length;i++) i_a[i]=i_b[i]=0;/* 逆序存储 */ for (int i=0;i<a_size;i++) i_a[a_size-i-1]=a[i]-'0'; for (int i=0;i<b_size;i++) i_b[b_size-i-1]=b[i]-'0'; /* 高精度减法,求出a~b之间有多少个数 */int sum=Hps(Length,i_a,i_b);int temp=Hpa(Length,i_a,0); /* 返回book */while(sum>=0){for(int i=temp;i>=0;i--){ans[i_a[i]]++;}sum--;temp=Hpa(Length,i_a,1); /* 加1 */}for(int i=0;i<=9;i++)cout<<ans[i]<<" ";return 0;}
1 0
- 【蓝桥第一周】计数的梦
- 【模拟】计数的梦
- 计数的梦
- PID11 / 计数的梦
- Exercise(1):计数的梦
- PID11 / 计数的梦 ☆
- Java程序练习-计数的梦
- 新的一周开始,谈谈上一周,计划下一周
- 计数排序的实现
- 计数的好方法
- 计数的好方法
- EditText计数的实现
- 文本文件英文单词的计数
- python的引用计数
- 计数排序的思想
- 完整的计数排序
- 自己的引用计数
- 计数的基本原理
- 计算机网络知识要点
- ubuntu配置javaweb环境(jdk,tomcat,mysql,eclipse)
- leetcode Triangle
- UNIX环境编程-----原始套接字-----疑问:发送给原始套接字的数据是怎么处理的???
- STM32中EXTI(外部中断)和NVIC(嵌套向量中断)的关系
- 【蓝桥第一周】计数的梦
- Qt学习小记-NULL字符串和空(empty)字符串的区别
- sap JCO3.0安装缺少Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package (KB973544)
- 放球模型
- 属性树提供的操作函数
- Android常用的adb命令
- SAP接口编程-RFC系列05 : Table作为输出参数
- 多线程学习-停止线程
- 最小次数(递归)