SP6803题解

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

[题目传送门](https://www.luogu.com.cn/problem/SP6803)。

题意:

让你判断一下 $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\bmod5$(同上)。如果去后 $c$ 的末位大于 $5$,反之就看一下 $c+c/20$ 是否 $\ge$ $c-c\bmod5$(同上)。

这样一来不就成了考察我们分支结构吗?代码如下(比 @_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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值