题目:
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述:
输入正整数n,判断从1到n之中,数字1一共要出现几次。例如1123这个数,则出现了两次1。例如15,那么从1到15之中,一共出现了8个1。
输入格式:一个正整数n
输出格式:一个整数,表示1出现的资料
样例输入:15
样例输出:8
数据规模和约定:n不超过30000
思路:
起初看到这个题的时候小编由于思维定式曾一度将问题复杂化,反而忽略了最简单的遍历方法,由于数据大小很小所以利用遍历事可以实现的。
代码实现:
要对每一个数位进行判断所以可以利用对10取余来获得对应数位的值,代码如下:
while (n)
{
if (n % 10 == 1)sum++;
n /= 10;
}
这就是判断的核心算法只需要在外层套上for循环就行了,但是有很多人会这样写
#include<iostream>
using namespace std;
int main()
{
int n,sum=0;
cin >> n;
for (int i = n; i >= 1; i--)
{
while (i)
{
if (i % 10 == 1)sum++;
i /= 10;
}
}
cout << sum << endl;
return 0;
}
但是这种算法事错误的以为i的值会在循环中参与运算被改变所以我们需要添加一个变量代替i在循环中的运算。
最终代码:
#include<iostream>
using namespace std;
int main()
{
int n,sum=0;
cin >> n;
for (int i = n; i >= 1; i--)
{
int t = i;
while (t)
{
if (t % 10 == 1)sum++;
t /= 10;
}
}
cout << sum << endl;
return 0;
}
总结:
题目的解决不要一开始就像复杂算法而是通过题目的最大数据量给出合适的算法,有时候最简单的算法也是最容易呗忽略的