$题解 CF875A 【Classroom Watch】$

$ 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 ;
}

猜你喜欢

转载自www.cnblogs.com/Luke-Skywalker/p/11317167.html
今日推荐