【題目連結】
ybt 1096:數字統計
ybt 1949:【10NOIP普及組】數字統計
OpenJudge NOI 1.5 41:數字統計
【題目考點】
1. 分離整數的各位數字
對于數字a,a%10可以取到其個位,a/=10(整除)可以去掉其目前個位。
重複這一過程,即可從低位到高位分離各位上的數字。
例:分離數字123的各位數
a | a%10 | a/10 |
---|---|---|
123 | 3 | 12 |
12 | 2 | 1 |
1 | 1 |
每次循環中,a變為a/10,循環中取a%10,為目前a的個位,即為分離出的數字。當a為0時循環結束。
其原理為對數字的按位權展開。
例:輸入一個整數,從低位到高位輸出其各位數字,并用空格分隔,代碼為:
int n;
cin>>n;
for(int a = n; a > 0; a /= 10)
cout<<a % 10<<' ';
【解題思路】
- 設定函數求一個數中2的個數。
- 分離該數字的各位數字,統計其中2的個數。
- 周遊數字l~r,統計所有數中2的個數。
【題解代碼】
解法1:設函數,求一個數中2的個數
#include<bits/stdc++.h>
using namespace std;
int count2(int n)//求數字n中2的個數
{
int ct = 0;//計數
for(int a = n; a > 0; a /= 10)
{
if(a % 10 == 2)
ct++;
}
return ct;
}
int main()
{
int l, r, ct = 0;//ct:計數
cin>>l>>r;
for(int i = l; i <= r; ++i)//統計1~n中2的個數
ct += count2(i);
cout<<ct<<endl;
return 0;
}
解法2:将邏輯都寫在主函數中
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l, r, ct = 0;//ct:計數
cin>>l>>r;
for(int i = l; i <= r; ++i)
{
for(int a = i; a > 0; a /= 10)//分離各位數字
{
if (a % 10 == 2)//若這一位是2
ct++;
}
}
cout<<ct<<endl;
return 0;
}