SP6803题解

文章讨论了一种编程问题,涉及在0.95c到1.05c范围内寻找Absurd值较低的数。作者提出了一个通过去除c的尾部0和判断末尾数字的方法来确定条件是否满足的算法,并用C++展示了实现代码。
摘要由CSDN通过智能技术生成

请求撤下该题翻译并添上 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、付费专栏及课程。

余额充值