原题 [UVaoj 1225 digit-counting]
题目翻译
- 统计前 n n n 个正整数中出现数字 1 1 1 ~ 9 9 9 的次数
题目分析
-
转字符串思路
- 遍历 1 → n 1→n 1→n,把每个数转成字符串 s s s
- 遍历 s s s ,统计即可
-
不转的思路(我选择的)
-
遍历 i i i : 1 → n 1→n 1→n
-
取 i i i 的个位(
i % 10
),统计后删除最后一位(i /= 10
)即可
-
PE代码(看起来很正常对吧 ···)
// Presentation error
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n, times[10] = {0};
cin>>n;
for(int i = 1; i <= n; i++)
{
int k = i;
while(k)
{
times[k % 10]++;
k /= 10;
}
}
for(int i = 0; i <= 9; i++) cout<<times[i]<<" ";
cout<<endl;
}
return 0;
}
问题
- 度娘一下 ···
- 什么?! U V a UVa UVa 不过滤行末空格!!!
AC代码
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n, times[10] = {0}; // = {0} 表示全部元素设置为0
cin>>n;
for(int i = 1; i <= n; i++)
{
int k = i;
while(k)
{
times[k % 10]++;
k /= 10;
}
}
for(int i = 0; i < 9; i++) cout<<times[i]<<" ";
cout<<times[9]<<endl; // 单独输出最后一项,直接换行
}
return 0;
}