天天看點

資訊學奧賽一本通 1096:數字統計 | 1949:【10NOIP普及組】數字統計 | OpenJudge NOI 1.5 41

【題目連結】

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<<' ';
           

【解題思路】

  1. 設定函數求一個數中2的個數。
    • 分離該數字的各位數字,統計其中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;
}
           

繼續閱讀