$ CF875A Classroom Watch$
本题乍一看仿佛是一道数学题,(因为数据\(1\leq n \leq 10^9\)吗)但事实上,本题是一道枚举题,只是枚举的范围值得我们去思考。我们一步一步来解决这道问题
\[First:\text{如何判断}x\text{是否为符合题意的数}\]
首先,我们需要开一个子函数\(f()\),函数的类型应该为\(bool\),因为要判断是否符合题意吗。那参数又有几个呢,当然是一个参数\(x\),因为\(x\)为要判断的数吗。
所以,我们可以写出以下代码\(:\)
inline bool f(int x)
{
int ans = x ;
while(x)
{
ans += (x % 10) ;
x /= 10 ;
} //将x分解,计算ans的值
if(ans==n)
return 1;//如果符合题意,返回1
return 0; //不符合题意,返回0
}
以上代码中inline
只是用来加快程序运行的,没有什么实际意义,不会用的\(OIer\)把inline
去掉同样也能\(AC\),只不过用时多了一点\((QAQ)\)。
\[Second:\text{枚举范围}\]
还是比较难想和难讲的(冒汗),
\(∵n\)的取值范围为\(1\leq n \leq 10^9\),所以,我们可以将\(n\)取\(10^9-1\),(因为这样各位数的和就最大的吗),此时各位数的和为\(81\),所以,枚举的范围就是\(1\leq i \leq n-81\),那有些人就要有疑问了,如果\(n\)不到\(81\)怎么办呢?没事,当\(i \leq 0\)时是不可能符合条件的,所以多枚举\(81\)个数问题也不大。
代码如下:
for(int i=n-81;i<=n;i++)
{
//具体内容
}
\[Last:\text{如何保存符合条件的}x\]
这个简单,用\(queue,vector,set\),数组\(……\)都可以,我在这里就用\(vector\)(\(STL\)大法好)了,十分简单,直接上代码:
//int main之外
vector < int > s; //定义
//int main之内
if(f(i)) s.push_back(i); //加入x
cout << s.size() << endl ; //输出个数
for(int i=0;i<s.size();i++)
cout << s[i] << endl ; //输出vector中的元素
如果读者不会使用\(vector\),那使用数组也可以\(AC\)
\(My \ complete \ code:\)
#include<bits/stdc++.h>
using namespace std ;
int n ;
vector < int > s;
inline int f(int x)
{
int ans = x ;
while(x)
{
ans += (x % 10) ;
x /= 10 ;
}
if(ans==n)
return 1;
return 0;
}
int main() {
cin >> n ;
for(int i=n-81;i<=n;i++)
{
if(f(i)) s.push_back(i);
}
cout << s.size() << endl ;
for(int i=0;i<s.size();i++)
cout << s[i] << endl ;
return 0 ;
}