3개의 정수를 입력받고 그 곱의 값에 숫자가 각각 몇번 사용됐는지 알아보는 문제이다.
일단 3개의 정수가 100보다 크고 1000보다 작으므로 그 곱은 7~10자리 범위의 숫자이다.
각 자리수를 구하는 방법은 다음과 같다.
처음 값에서 10을 나눈 나머지가 가장 마지막 자리수가 된다.
그 다음 처음 값을 10으로 나누고 다시 이 값을 10으로 나눈 나머지가 마지막 자리의 앞에 있는 수가 된다.
이 과정을 반복하면 모든 자리의 수를 구할 수 있다.
#include <bits/stdc++.h>
using namespace std;
int arr[11];
int main()
{
char mul[11];
int a, b, c, d, tmp, cnt=0;
cin >> a >> b >> c;
d = a * b * c;
while (d != 0)
{
mul[cnt] = d % 10;
d /= 10;
cnt++;
}
for (int i = 0; i < cnt ; i++)
{
tmp = mul[i]-'\0';
arr[tmp]++;
}
for (int i = 0; i < 10; i++)
printf("%d\n", arr[i]);
}
내가 작성한 방식은 입력받은 3개의 정수의 곱을 d에 삽입하고 이를 분해하면서 char형 배열 mul에 삽입한다. 그 다음 이를 다시 반복문을 돌면서 arr배열에 삽입한다.
이는 매우 비효율적이다.
굳이 mul배열을 만들 필요가 없이 문제를 해결할 수 있다.
while문과 첫번째 for문으로 나누었던 각 자리수를 구하는것과 구한 각각의 자리수를 arr배열에 삽입하는것을 합하였다.
#include <bits/stdc++.h>
using namespace std;
int arr[11];
int main()
{
int a, b, c, d;
cin >> a >> b >> c;
d = a * b * c;
while (d != 0)
{
arr[d % 10]++;
d /= 10;
}
for (int i = 0; i < 10; i++)
printf("%d\n", arr[i]);
}