题目描述:
请统计某个给定范围 [L, R]的所有整数中,数字 2 出现的次数。
比如给定范围 [2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6 次。
输入:
2 个正整数 L 和 R,之间用一个空格隔开。
输出:
数字 2 出现的次数。
分析:因为是单组数据,所以可以直接for一遍从l到r,然后将每个数字的每一位分离出来,这就需要一个循环依次取出每一位,有一个2,计数器就+1,然后输出即可。因为平时的输入数据一般是多组,所以习惯性地打表记录做到每次O(1)的查询,用一个前缀和数组sum维护到第几个数字的时候2所出现的次数,最后输出sum[r]-sum[l-1]即可。
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<cstdio> #include<vector> #include<cctype> #include<cstring> #include<utility> #include<cstdlib> #include<iomanip> #include<iostream> #include<algorithm> #define Clear(x) memset(x,0,sizeof(x)) #define fup(i,a,b) for(int i=a;i<b;i++) #define rfup(i,a,b) for(int i=a;i<=b;i++) #define fdn(i,a,b) for(int i=a;i>b;i--) #define rfdn(i,a,b) for(int i=a;i>=b;i--) typedef long long ll; typedef unsigned long long ull; using namespace std; const int maxn =1e5+7; int sum[maxn]; int read() { char ch=getchar();int ret=0,f=1; while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();} return f*ret; } void slove() { int cnt; sum[2]=1; rfup(i,3,) { cnt=0; int j=i; while(j){ if(j%10==2) cnt++; j/=10; } sum[i]+=cnt; sum[i]+=sum[i-1]; } } int main() { slove(); int l=read(),r=read(); printf("%d\n",sum[r]-sum[l-1]); return 0; }
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/122283.html