SP6803题解

· · 题解

请求撤下该题翻译并添上 LaTeX 数学公式。

题目传送门。

题意:

让你判断一下 0.95c\sim 1.05c 之间的是否有比 c 小的 Absurd 值的数。

思路:

定义一个 flag 用来判断 0.95c\sim 1.05c 是否满足比 c 的 Absurd 值的数的条件。满足则赋值为 1,不满足设为 0,之后再判断一下 flag 是否为 1 并且 c 不为 0,是则输出 absurd,不是输出 not absurd。

那么如何找比 c 的 Absurd 值低的数呢?据题目内容非 0 位的数越少,则 Absurd 值越低;还有当 c 尾数是 5 时,则 Absurd 值也低。

所以,我们要去 c 的后置 0,如果去后 c 的末位是 5,那么就看一下 c/20 是否 \ge 5(如果是那么它就是我们找的那个数),如果去后 c 的末位 <5,就看一下 c-c/20 是否 \le c-c\bmod 5(同上)。如果去后 c 的末位大于 5,反之就看一下 c+c/20 是否 \ge c-c\bmod 5(同上)。

这样一来不就成了考察我们分支结构吗?

代码如下(比 @maojun 的题解感觉要简单一些):

#include <iostream>
using namespace std;
long long i,n,c,j,flag;
int main(){
    cin>>n;
   while(n--){
   cin>>c,flag=0;//清零 
   for(j=1;j<=9;j++){
    if(c%10==0) // 他末尾是0时
    {
    c/=10;//去末尾0。 
    }
    else
    {
    break;
    }
        }
        if (c%10==5) //当他末尾是5时 
        {
            if (c/20>=5) flag=1;
        }
        else//当末尾比5小时或比5大时 
        {
            if (c-c/20<=c-c%5) flag=1;
            if (c+c/20>=c+(5-c%5)) flag=1;
        }
        if (flag==1 && c!=0) 
        cout<<"absurd"<<endl;
        else 
        {
        cout<<"not absurd"<<endl;
        }
    }   
}
此题需要使用 long long。