2025年NOIP 2010 数字统计

NOIP 2010 数字统计题目描述 请统计某个给定范围 L R 的所有整数中 数字 2 出现的次数 比如给定范围 2 22 数字 2 在数 2 中出现了 1 次 在数 12 中出现 1 次 在数 20 中出现 1 次 在数 21 中出现 1 次 在数 22 中出现 2 次 所以数字 2

大家好,我是讯享网,很高兴认识大家。

题目描述:

请统计某个给定范围 [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; } 

讯享网

 

小讯
上一篇 2025-03-25 17:22
下一篇 2025-02-15 18:46

相关推荐

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