首页 > 其他分享 >数字检测 题解

数字检测 题解

时间:2024-07-31 16:41:10浏览次数:7  
标签:10 进制 jz 题解 sum 数字 检测 define

题目id:20317

题目描述

作为一个学渣的鱼大大在学习了进制数之后,经常会写错进制数,导致他在做题的时候经常出现,写到了最后发现数字是错的情况,非常浪费时间。所以他迫切地想要一位大聪明随时随刻能帮他检测一下他写的\(n\)进制数到底是不是对的。现在鱼大大给出了一个\(n\)进制的数\(m\),问此进制数是否合法。
注:大于\(10\)进制的数,超过9的数字分别用大写字母A ~ Z表示

解题思路

本题十分简单,就是一道转进制的模板题再加上一些判断,当然还有小小(dà dà)的坑,会使你丢掉\(40\)分呢
由于进制可能大于\(10\),于是我们需要建立一个用于存放所有进制所有可能出现的数(或字母)的表,最大可以表示到Z,现建表如下:
string jz="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
本蒟蒻第一次提交\(80pts\)就是表没建对\(QwQ\),只考虑了十六进制A ~ F,第二次就\(\textcolor[RGB]{82,196,26}{Accepted}\)了,可恶o(≧口≦)o
假设输入的为\(n\)进制,那么在该进制中最大可出现的字符就是\(jz_{n-1}\),遍历整个数即可,若某个数的\(ASCLL\)码比\(jz_{n-1}\)大,就输出当前下标加\(1(\)因为字符串下标从\(0\)开始\()\)和当前字符,输出后直接结束程序。

for(int i=0;i<s.length();++i)
    if(s[i]>jz[n-1])
    {
        cout<<i+1<<' '<<s[i]<<'\n';
        flag=1;
    }
if(flag)exit(0);

这里,就要说那个会使你丢掉\(40\)分的很坑的点了:
题目里说:保证输入数据只包含数字和字母,但它没说一定是大写字母,如果只考虑大写就只有\(60pts\),还好我发现了
接下来转\(10\)进制大家都会吧,一边除以\(10\)一边模\(10\),模板如下:

while(sum)
{
    ten[++t]=sum%10;
    sum/=10;
}

再加一个考虑字母即可:

for(int i=s.length()-1;i>=0;--i)
{
    if(s[i]>='0'&&s[i]<='9')
        sum+=cnt*(s[i]-48);
    else 
        sum+=cnt*(s[i]-55);
    cnt*=n;
}
while(sum)
{
    ten[++t]=sum%10;
    sum/=10;
}

其中sum+=cnt*(s[i]-55);中\(55\)是\(-65+10\)的化简,先转数字在加上大于十进制的\(10\)。

AC Code

#include<bits/stdc++.h>
#define N 1000007
#define INF 1e18
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define IOS ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
string jz="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",s;
int n,sum,cnt=1,ten[114514],t;
bool flag;
int main()
{
    IOS;
    cin>>n>>s;
    for(int i=0;i<s.length();++i)
        if(s[i]>jz[n-1])
        {
            cout<<i+1<<' '<<s[i]<<'\n';
            flag=1;
        }
    if(flag)exit(0);
    for(int i=s.length()-1;i>=0;--i)
    {
        if(s[i]>='0'&&s[i]<='9')
            sum+=cnt*(s[i]-48);
        else 
            sum+=cnt*(s[i]-55);
        cnt*=n;
    }
    while(sum)
    {
        ten[++t]=sum%10;
        sum/=10;
    }
    for(int i=t;i;--i)
        cout<<ten[i];
    return 0;
}

标签:10,进制,jz,题解,sum,数字,检测,define
From: https://www.cnblogs.com/988176-/p/18334953

相关文章

  • 检测 ttk 输入小部件的文本
    我想检测tkinterttk条目小部件的文本我尝试过:importtkinterastkfromtkinterimportttktk=tk.Tk()e1=ttk.Entry(tk)ife1=="good"print("good")几乎做到了!问题是正在将ttk.Entry对象本身与字符串“good”进行比较,而不是比较其内容。要访问......
  • 无线可穿戴数字听诊器解决方案特色解析
    前记 随着可穿戴技术的不断进步,以及医疗健康领域的数字化进程不断加快。听诊器的数字化逐步市场提到了一个必须要解决的问题,鉴于此,团队在深耕生理信号采集的过程中,不断完善可穿戴数字听诊器的方案。经过长时间的努力,做出来一系列基于低功耗蓝牙的可穿戴听诊器解决方案。可以满......
  • 题解_P2024 [NOI2001] 食物链
    [NOI2001]食物链题目描述动物王国中有三类动物\(A,B,C\),这三类动物的食物链构成了有趣的环形。\(A\)吃\(B\),\(B\)吃\(C\),\(C\)吃\(A\)。现有\(N\)个动物,以\(1\simN\)编号。每个动物都是\(A,B,C\)中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这......
  • 20240731题解
    这么简单的题目没有AK(计时器(timer)题目:每次可以加上\(2^n-1\),问多少次变成\(x\)题解:因为较大的数大于较小的数的两倍,直接贪心的选最大的即可。复杂度\(\Theta(T\logn)\)代码:#include<cstdio>#defineintlonglongconstintN=105,A=1000000000000000000;intT,x,f[N......
  • P4784 城市 题解 / 最小斯坦纳树
    P4784城市题解题目大意给定\(n\)个节点,\(m\)条带边权边,和\(k\)重要节点。选择一些边,使得这些边能让这\(k\)个节点连通,代价为选出的边权和。求最小代价。(\(k\leq5\))Solve前置芝士:斯坦纳树。定义将指定点集合(部分点)中的所有点连通,且边权总和最小的生成树称为最小斯坦......
  • BI 工具如何助力市政设计公司实现数字化转型?
    一、前言近年来,国家出台多个政策文件来鼓励和发展数字化和智能化,如《十四五规划》提出要推进产业数字化转型、《交通强国建设纲要》提出要大力发展智慧交通、上海市发布的《关于全面推进上海城市数字化转型的意见》中强调了以数据要素为核心,构建城市运行生命体征指标体系和城市神......
  • 我的目标是检测车道并控制车辆保持在车道中央。使用Python
    我目前正在做一个项目,我是一个初学者。并且我需要找到一种方法来使用检测到的车道来控制我的项目车辆保持在两条线之间的中心。img1|||img2我有疑问的话题如下如何判断我的机器人车是否在车道中央?我们应该用什么方法来控制机器人的转向......
  • java覆盖率检测-jacoco
    一、Jacoco简介官网地址:https://www.jacoco.org/jacoco/trunk/index.html 一、Jenkins集成jacoco1、安装JaCoCo插件jenkins->系统管理->管理插件在可用插件搜索Jacoco,搜索到安装即可  2、在job中增加“构建后操作”,选择'RecordJaCoCocoveragereport'   3、......
  • 【Python】正色表达式 - 验证罗马数字
    一、题目Youaregivenastring,andyouhavetovalidatewhetherit'savalidRomannumeral.Ifitisvalid,printTrue.Otherwise,printFalse.TraytocreatearegularexpressionforavalidRomannumeral.InputFormatAsinglelineofinputcontainin......
  • P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)
    原题题意若一个由010101组成的字符串将000和......