11 条题解
-
5
题前吐槽
这叫2010!!!简单过头了哈!
题解
这个题目,看起来难。其实我们枚举 到 ,然后对每一个数都拆解(使用int转string的方法逐位拆开)。 过于简单直接上代码(注释里有更详细的)
#include <bits/stdc++.h> using namespace std; int L, R, ans; int check(int num) // 计算一个数字的2含量 { int ans = 0; while (num > 0) { ans += (num % 10) == 2; // 拆出来的一位如果相同就让ans加一 num /= 10; } return ans; } int main() { scanf("%d%d", &L, &R); for (int i = L; i <= R; i++) { ans += check(i); // 枚举、计算、相加 } printf("%d\n", ans); return 0; }
很简单有没有。
#include <bits/stdc++.h> using namespace std; int L, R, ans; int check(int num) { int ans = 0; while (num > 0) { ans += (num % 10) == 2; num /= 10; } return ans; } int main() { scanf("%d%d", &L, &R); for (int i = L; i <= R; i++) { ans += check(i); } printf("%d\n", ans); return 0; }
延伸与拓展
这个题太氵了,于是我们把 改成了 ,
可是依旧很氵。#include <bits/stdc++.h> using namespace std; int L, R, ans, k; int check(int num) { int ans = 0; while (num > 0) { ans += (num % 10) == k; num /= 10; } return ans; } int main() { scanf("%d%d%d", &L, &R, &k); for (int i = L; i <= R; i++) { ans += check(i); } printf("%d\n", ans); return 0; }
直接改一下就可以了。
如何计算时间复杂度:
这个题的时间复杂度比较难算,就是最大数字位数 最大数字个数,我们可以通过 来计算 的位数。 所以时间复杂度就是 了。
-
3
俗话说的好,套公式少不了 · · · · · ·
上代码!
#include <iostream> #define ll long long using namespace std; ll f(ll n, ll num) { ll base = 1, cnt = 0; while (base <= n) { ll pre = n/(base*10), suf = n%base, now = n/base%10; if (now < num) cnt += pre * base; else if (now == num) cnt += pre * base + suf + 1; else cnt += (pre + 1) * base; if (!num) cnt -= base; base *= 10; } return cnt; } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); ll l, r; cin >> l >> r; cout << f(r, 2) - f(l - 1, 2); return 0; }
-
3
这道题太简单了!!!!
还是2010年的题!!!
·······································································
思路: 输入 l 和 r , for 循环从 l 到 r ,每次将 i 拆分成一个一个数字,拆一个判断 一下是否符合要求,是的话就num++,拆完之后sum+=num。最后输出 sum 就好了。
·······································································
代码:
for(int i=l;i<=r;i++) { int num=0,j=i; //这是很重要的,不加会陷入死循环 while(j>0) { int t=j%10; //拆各位 if(t==2) num++; j/=10; //去各位 } sum+=num; } cout<<sum; return 0;
-
2
太简单了!!!直接上代码
AC Code
#include<bits/stdc++.h> using namespace std; int l, r, sum; int find(int x) { int num = 0; while(x > 0) { int y = x % 10; x /= 10; if (y == 2) { num++; } } return num; } int main() { cin >> l >> r; for (int i = l; i <= r; i++) { sum += find(i); } cout << sum; return 0; }
-
2
对于这题,我们应该枚举所有的数,然后依次对每位进行判断,如果发现2,就将答案+1。
#include <bits/stdc++.h> // 万能头文件 using namespace std; int L, R, ans; int main() { scanf("%d %d", &L, &R); for (int i = L; i <= R; i++) { int w = i; while (w > 0) { int now = w % 10; // 求各位 if (now == 2) // 如果这位为2,则答案+1 ans++; w /= 10; } } printf("%d", ans); return 0; }
-
2
这应该是全国最简单的代码了吧······不废话了,直接上代码,解释看注释。
#include <bits/stdc++.h>
using namespace std;
int l,r,num,tmp;
int main()
{
cin>>l>>r; for(int i=l;i<=r;i++) { tmp=i;//这一步千万要写,否则会无限循环 while(tmp>0)//每次都判断一遍 { if(tmp%10==2) num++;//tmp%10是指tmp的个位,这里判断是不是2 tmp/=10;//tmp除以10,下次判断个位时,就是新的数位了 } } cout<<num; return 0;
}
最后厚颜无耻地求一波赞~~~
-
2
题目描述:
统计[L,R]的所有整数中,数字2出现的次数。 例如,22出现了2次2,12出现了1次2。
进入正题:
简单分析完题目,就是一个很简单的数位拆分问题,只不过我们要算一个范围内的每一个数。 那么我们用一个for循环去遍历L到R,之后在数位拆分不就好啦!
这里比较重要的数学知识是:
1、中括号括起来的范围是包含头和尾的。
2、取的是一个数的每一位。 需要用到%10,对10取余取每一位数,之后把这个数再次/10,除10去掉这一位。不断重复知道这个数不能在除了(这也是数位拆分的思想)
开始我们的重要代码部分:
for(int i=L;i<=R;i++){ //这里就是遍历L到R中的每一个数 tmp=i; //此处解析看下文 //之后进行很典型的数位拆分 while(tmp>0){ if(tmp%10==2){ num++; } tmp/=10; } //这里我们把每一次算的数量放在sum中 //同时把num归零便于下一次计算。 sum+=num; num=0; }
tmp=i;
我们为什么会用到tmp这样的中间变量呢? 因为 i 代表的是每一次的变化的数,如果直接用 i 进行数位拆分,就破坏了我们想遍历L到R每一个数的想法,所以这里需要用一个其他变量来代表i进行取数。
数位拆分
2345这样的四位数如何取每一位的值呢?
步骤1~ 可以运用对10取余这样就可以取到个位。 2345%10=5;
步骤2~ 再次运用除10把个位数删掉。 2345/10=234;
重复以上步骤
对234再次对10取余
234%10=4;
234/10=23;
不断进行这样的操作 ....... .......
直到剩到 2/10=0的时候,结束while循环。
-
1
AC代码
#include <iostream> using namespace std; int l,r,num;//l表示左端点,r表示右端点 int main() { cin>>l>>r; //从l至r循环遍历 for(int i=l;i<=r;i++){ int y=i; //统计2的数量 while(y>0){ if(y%10==2) num++; y/=10; } } cout<<num; return 0; }
- 1
信息
- ID
- 1562
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 318
- 已通过
- 199
- 上传者