首页 > 其他分享 >洛谷 P1015 回文数

洛谷 P1015 回文数

时间:2023-03-12 11:11:47浏览次数:54  
标签:洛谷 高精度 P1015 int 字符串 include 回文

P1015 回文数

https://www.luogu.com.cn/problem/P1015 原题

很明显的高精度,(1999年竟然就考
主要有:高精度加法(含进位)、高精度判断回文数 以及可以把字符串转成数字数组

这道题还是很良心,只有16进制是陌生的,所以特判就好
而且数字长度只有100位,反正是很水的一道题了(虽然我被卡
要注意16进制里,A~F 是 10~15

对于字符串的读入还是要注意,题目中数字换了一行,所以注意不要读了换行

字符串的读入 https://www.cnblogs.com/wuwendongxi/p/13339796.html

主函数

int main(){
    cin>>n>>m;  //
    len=m.size();
    TurnIntoNumber();  // 字符串转数组的函数,可有可无,字符串还有各种函数更方便
    while(++cnt<=30){  // 记录目前转换次数
        int h=0;
        for(int i=0;i<len;i++){  // 高精度
            num2[i]=num[i]+num[len-i-1]+h;
            h=num2[i]/n;
            num2[i]%=n;
            if(i==len-1&&h!=0){  // 最后一位判断进位
                num2[len]=h,len++;
                h=0;
                break;
            }
        }
        if(IsPalindromicNumber(num2)==true){  // 判断回文数
            printf("STEP=%d",cnt);  // 如果可以直接输出
            return 0;
        }
        for(int i=0;i<len;i++)  // 换一下,这里用字符串更方便,有strcpy
            num[i]=num2[i];
        memset(num2,0,sizeof(num2));
    }
    printf("Impossible!");  // 不可以就impossible
    return 0;
}

判断回文数

bool IsPalindromicNumber(int k[]){
    for(int i=0;i<len/2;i++)
        if(k[i]!=k[len-i-1])
            return false;
    return true;
}

数字反转

因为高精度还是反着做比较好,于是需要反一下数字的顺序

这里又一次体现出string的好处,可以直接用reverse()
用数组做的话,只能通过下标控制了,需要找一下规律

void TurnIntoNumber(){
    for(int i=0;i<len;i++)
        if(n==16&&'A'<=m[len-i-1]&&m[len-i-1]<='Z')
            num[i]=m[len-i-1]-55;
        else
            num[i]=m[len-i-1]-48;
}

最后的完整代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n,len,cnt,num[109],num2[109];
string m;

bool IsPalindromicNumber(int k[]){
    for(int i=0;i<len/2;i++)
        if(k[i]!=k[len-i-1])
            return false;
    return true;
}

void TurnIntoNumber(){
    for(int i=0;i<len;i++)
        if(n==16&&'A'<=m[len-i-1]&&m[len-i-1]<='Z')
            num[i]=m[len-i-1]-55;
        else
            num[i]=m[len-i-1]-48;
}

int main(){
    freopen("1.txt","r",stdin);
    cin>>n>>m;
    len=m.size();
    TurnIntoNumber();
    while(++cnt<=30){
        int h=0;
        for(int i=0;i<len;i++){
            num2[i]=num[i]+num[len-i-1]+h;
            h=num2[i]/n;
            num2[i]%=n;
            if(i==len-1&&h!=0){
                num2[len]=h,len++;
                h=0;
                break;
            }
        }
        if(IsPalindromicNumber(num2)==true){
            printf("STEP=%d",cnt);
            return 0;
        }
        for(int i=0;i<len;i++)
            num[i]=num2[i];
        memset(num2,0,sizeof(num2));
    }
    printf("Impossible!");
    return 0;
}

标签:洛谷,高精度,P1015,int,字符串,include,回文
From: https://www.cnblogs.com/plokmnjiu/p/17207790.html

相关文章

  • 5.最长回文子串
    最长回文子串给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"......
  • 洛谷-2822
    洛谷-2652key思路有个modk的想法很好,然后就是对于一遍一遍的询问进行前缀和优化,但有个问题就是算出来的s矩阵最开始是个下三角矩阵,但是根据前缀和公式来看,s[i][j]上方......
  • 【洛谷】P3365 改造二叉树(LIS)
    原题链接题意给定一颗二叉树,每次操作可以修改一个点的权值为任意整数,求将原树变为二叉搜索树的最小操作次数。注意:本题中的二叉搜索树定义为:每个左边儿子的权值都严格小......
  • 【LeetCode回溯算法#05】分割回文串(复习双指针判断回文以及substr函数使用记录)
    分割回文串力扣题目链接给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。示例......
  • 回文山
     /***@version1.0*@auther孙沐华*StringBuffer跟StingBuilder字符串内容是存在char[]value,所以在变化(增加/删除)*中不用每次都更换地址(即不是每次都......
  • 洛谷P1213 [USACO1.4][IOI1994]时钟 The Clocks
    这是一个暴力枚举题有两种解决方法,第一种用九重for循环(有点麻烦,尽量别用),第二种简化版(虽然行数少了,但难理解),先来看看 题目!!!题目描述考虑将如此安排在一个 3*3 行......
  • 进制转换 洛谷P1017
    题目传送门题目描述我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置为指数,以 1010 为底数的幂之和的形式。例如 123123 可表......
  • 洛谷P1036
    P1036[NOIP2002普及组]选数典型的dfs,建议书写递归代码时层次应与形参列表中自己所标志的层次相对应,否则很容易混乱importjava.util.Scanner;publicclassP1036......
  • 洛谷P1030
    P1030[NOIP2001普及组]求先序排列思路:由后序遍历序列求出根由中序遍历序列求出左右子树递归上述12直到中序/后续遍历序列为空publicclassP1030{//已......
  • 洛谷P1149 [NOIP2008 提高组] 火柴棒等式
    这道题就是一个经典的暴力枚举题意是输出一共有的火柴根数,输出这些火柴棒用完可以有多少拼法下面,我们来数一数拼成十个数和两个符号(’+‘&&’=‘)各用几根火柴棒0要用......