3의 개수는?(large)


자연수 N이 입력되면 1부터 N까지의 자연수를 종이에 적을 때 각 숫자 중 3의 개수가 몇 개 있는지 구하려고 합니다.

예를 들어 1부터 15까지는 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5으로 3의 개수는 2개입니다.

자연수 N이 입력되면 1부터 N까지 숫자를 적을 때, 3의 개수가 몇 개인지 구하여 출력하는 프로그램을 작성하세요.

▣ 입력설명
첫 줄에 자연수의 개수 N(3<=N<=1,000,000,000)이 주어집니다.

▣ 출력설명
3의 개수를 출력하세요.

▣ 입력예제 1 
15

▣ 출력예제 1
2


풀이

3의 개수를 일일히 세는게 아니라 수학적 계산을 통해서 바로 구하도록 만들었다.

void solve()
{
	long long n;
	cin >> n;

	int res = 0;
	int left = 1, right, cur, k = 1;
	while (left != 0)
	{
		left = n / (k * 10);
		right = n % k;
		cur = (n / k) % 10;

		if (cur > 3)
		{
			res = res + ((left + 1) * k);
		}
		else if (cur == 3)
		{
			res = res + ((left * k) + (right + 1));
		}
		else
		{
			res = res + (left * k);
		}

		k *= 10;
	}

	cout << res;
}

전체 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>

using namespace std;

/*
1 ~ 9			-> 1
10 ~ 99			-> 10 * 1 + 10 * 1
100 ~ 999		-> 280 -> 10 * 10 * 1 + 10 * 10 +
1000 ~ 9999		->

275
28 + 30
58
*/

void solve()
{
	long long n;
	cin >> n;

	int res = 0;
	int left = 1, right, cur, k = 1;
	while (left != 0)
	{
		left = n / (k * 10);
		right = n % k;
		cur = (n / k) % 10;

		if (cur > 3)
		{
			res = res + ((left + 1) * k);
		}
		else if (cur == 3)
		{
			res = res + ((left * k) + (right + 1));
		}
		else
		{
			res = res + (left * k);
		}

		k *= 10;
	}

	cout << res;
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}