首页 > 编程语言 >算法题:分别用c++/python/java实现回文数

算法题:分别用c++/python/java实现回文数

时间:2023-10-30 13:01:20浏览次数:40  
标签:10 java python List c++ int carry 回文 size


回文数是一个数字,从左到右和从右到左读都是相同的数字序列。换句话说,回文数在数值上是对称的。一些常见的回文数示例包括:

  1. 单个数字:例如1、2、3等,它们本身就是回文数,因为它们只有一个数字。
  2. 两位数:例如11、22、33等,它们也是回文数,因为它们的左右两个数字相同。
  3. 多位数:例如121、1331、1221等,这些数字从左到右和从右到左读都是相同的。

C++实现

这段代码的目标是寻找一个初始数"921",然后反复对它执行特定的加法操作,直到找到一个回文数,或者进行30次操作后仍然找不到回文数时,打印"impossible"。

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

int n=10,a[101],b[101],ans,i;//n=10代表十进制,也可以改成8或者16等
void init(int a[]){
    string s="921";
    memset(a,0,sizeof(a));
    a[0]=s.length();
    for(int i=1;i<=a[0];i++) {
        if (s[a[0] - i] >= '0' && s[a[0] - i] <= '9') {
            a[i] = s[a[0] - i] - '0';
        } else {
            a[i] = s[a[0] - i] - 'A' + 10;//16进制的处理
        }
    }
}
bool check(int a[]){
    for(i=1; i<=a[0];i++){
        if(a[i]!=a[a[0]-i+1]){
            return false;
        }
    }
    return true;
}
void jia(int a[]){
    int i;
    for(i=1;i<=a[0];i++){
        b[i]=a[a[0]-i+1];//反序数b
    }
    for(i=1;i<=a[0];i++){
        a[i]+=b[i];
    }
    for(i=1;i<=a[0];i++){
        a[i+1]+=a[i]/n;
        a[i]%=n;
    }
    if(a[a[0]+1]>0){
        a[0]++;
    }
}
void printArray(int a[]){
    int size = a[0];
    cout<<"size: "<<size<<endl;
    for (  int  i=size;i>0;i-- ){
        cout << a[i] << " "  ;
    }
    cout <<endl ;  //
}
int main(){
    init(a);
    cout<<"init:"<<endl;
    printArray(a);
    if(check(a)){
        cout<<0<<endl;
        return 0;
    }
    ans=0;
    while(ans<=30){
        ans++;
        jia(a);
        cout<<"Test: "<<ans<<"  ";
        printArray(a);
        if(check(a)) {
            cout << ans << endl;
            return 0;
        }
    }
    cout<<"impossible";
    return 0;
}

代码解释

在这段代码中,n 的值被设置为 10,表示在十进制下进行运算。如果你将 n 的值更改为 8,那么代码中的加法运算和进位处理将按八进制进行。同样,如果你将 n 的值更改为 16,那么代码中的加法运算和进位处理将按十六进制进行。这取决于你想要在哪种进制下执行操作。不同进制下,数字的表示和处理方式会有所不同。

上述代码的难点可能在以下几个方面:

  1. 进制转换和数学运算:代码涉及到了进制的转换,特别是将字符表示的数字(0-9和A-F)转化为相应的整数值。这需要对字符操作和数学运算有一定的理解。
  2. 回文数检测:判断一个数字或数组是否是回文数需要有一定的算法知识。虽然代码中的 check 函数比较简单,但编写更复杂的回文数检测算法可能会更具挑战性。
  3. 进位处理:在 jia 函数中,涉及到进位的处理。这要求对数学中的进位运算有一定的了解。

Python实现

def init(a):
    s = "921"
    a.clear()
    a.extend(map(int, s[::-1]))

def check(a):
    return a == a[::-1]

def jia(a):
    b = a[::-1]
    carry = 0
    for i in range(len(a)):
        a[i] += b[i] + carry
        carry = a[i] // 10
        a[i] %= 10
    if carry:
        a.append(carry)

def print_array(a):
    size = len(a)
    print("size:", size)
    print(" ".join(map(str, a)))

if __name__ == "__main__":
    a = []
    init(a)
    print("init:")
    print_array(a)

    if check(a):
        print(0)
    else:
        ans = 0
        while ans <= 30:
            ans += 1
            jia(a)
            print(f"Test: {ans}  ", end="")
            print_array(a)
            if check(a):
                print(ans)
                break
        else:
            print("impossible")

java实现

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PalindromeCheck {
    public static void init(List<Integer> a) {
        String s = "921";
        a.clear();
        for (int i = s.length() - 1; i >= 0; i--) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                a.add(Character.getNumericValue(c));
            } else {
                a.add(c - 'A' + 10);
            }
        }
    }

    public static boolean check(List<Integer> a) {
        List<Integer> copy = new ArrayList<>(a);
        Collections.reverse(copy);
        return a.equals(copy);
    }

    public static void jia(List<Integer> a) {
        List<Integer> b = new ArrayList<>(a);
        Collections.reverse(b);

        int carry = 0;
        for (int i = 0; i < a.size(); i++) {
            int sum = a.get(i) + b.get(i) + carry;
            a.set(i, sum % 10);
            carry = sum / 10;
        }

        if (carry > 0) {
            a.add(carry);
        }
    }

    public static void printArray(List<Integer> a) {
        int size = a.size();
        System.out.println("size: " + size);
        for (int i = size - 1; i >= 0; i--) {
            System.out.print(a.get(i) + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        List<Integer> a = new ArrayList<>();
        init(a);
        System.out.println("init:");
        printArray(a);

        if (check(a)) {
            System.out.println(0);
        } else {
            int ans = 0;
            while (ans <= 30) {
                ans++;
                jia(a);
                System.out.print("Test: " + ans + "  ");
                printArray(a);
                if (check(a)) {
                    System.out.println(ans);
                    break;
                }
            }
            if (ans > 30) {
                System.out.println("impossible");
            }
        }
    }
}


标签:10,java,python,List,c++,int,carry,回文,size
From: https://blog.51cto.com/u_16065421/8087721

相关文章

  • 用c++写一个高精度计算的除法运算
    高精度除以低精度以下这段代码的主要作用是将一个大整数(以字符数组形式表示)除以一个整数,并输出结果。具体来说,代码将大整数a1(“1256”)除以整数b(3),并输出商。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;intmain(){chara1[100]="1256";......
  • java.net.SocketException四大异常解决方案
    java.net.SocketException四大异常解决方案java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题。希望大家有所帮助。那么我们就来看看有关java.net.SocketException的相关知识。第1个异常是java.net.BindException:Addressalread......
  • Python学习2
    FileOperationsFunction  att=funcName(xx) Ans:Error ......
  • 用Python计算圆周率pi
    一、计算圆周率pi的方法(一)公式法pi=0N=eval(input())forkinrange(N):pi+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))print(pi)(二)蒙特卡罗方法#e.6.1(p115)fromrandomimportrandomfrommathimportsqrtfromtimeimportperf_counterDARTS=100000......
  • 【java基础-实战3】list遍历时删除元素的方法
    在实际的业务开发中,容器的遍历可以说是非常非常常见的场景了,遍历删除呢,用的机会也比较多,那么有哪几种删除元素的方法呢?你用对了吗~本文循序渐进,先说几种容易出问题的方法,再引出几种比较可靠的方法~首先,初始化一个数组,用于后面的事例演示:List<Integer>list=newArrayList<>();......
  • Python 并发编程
    目录一.理论知识1.1多道技术相关2.1同步和异步阻塞和非阻塞二.进程对象编程2.1开启进程的方式2.2join方法2.3进程间数据隔离2.4进程对象其它方法pid2.4守护进程2.5互斥锁2.6进程之间的通信1,队列Queue模块2,ipc机制3,生产者消费者模式三.线程对象编程3.1开启线......
  • Python生成词云
    一、词云生成的基本原理词云是一种可视化展示文本内容的工具,用于显示文本中出现次数较高的关键词。其主要思想是将文本中频繁出现的词汇以视觉化的方式展现出来,可以很快地帮助人们了解文本的主要内容和关键信息。生成词云的基本原理是,首先需要解析文本中的关键词,统计其出现频率,然后......
  • Java技术分享:探索无限可能的编程世界
    作为一门广泛应用于软件开发领域的编程语言,Java在近几十年来一直保持着强大的生命力和广泛的影响力。本文将带您深入探索Java技术的各个方面,并分享一些有关Java编程的实用技巧和最新趋势。Java的优势与特点Java作为一种跨平台、面向对象的编程语言,具有许多独特的优势。首先,它的可......
  • Python常用模块-20个常用模块总结
    目录time模块datetime模块random模块os模块sys模块json和pickle模块hashlib和hmac模块logging模块numpy模块pandas模块matplotlib模块re模块typing模块collections模块pathlib模块shutil模块xml模块subprocess模块configparser模块Python常用模块小结time模块......
  • c++ .h头文件和.cpp源文件关系(转)
    https://www.cnblogs.com/fengzhengfly/p/8884581.htmlhttps://blog.csdn.net/qq_35452533/article/details/77282326头文件是声明,源文件是定义在cpp里包含.h,就会包含该h文件的cpp定义,所以需要在cpp里使用别的.h文件中的函数只能包含该.h,或者已包含的.h中已经包含的改.h,也就......