回文数是一个数字,从左到右和从右到左读都是相同的数字序列。换句话说,回文数在数值上是对称的。一些常见的回文数示例包括:
- 单个数字:例如1、2、3等,它们本身就是回文数,因为它们只有一个数字。
- 两位数:例如11、22、33等,它们也是回文数,因为它们的左右两个数字相同。
- 多位数:例如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,那么代码中的加法运算和进位处理将按十六进制进行。这取决于你想要在哪种进制下执行操作。不同进制下,数字的表示和处理方式会有所不同。
上述代码的难点可能在以下几个方面:
- 进制转换和数学运算:代码涉及到了进制的转换,特别是将字符表示的数字(0-9和A-F)转化为相应的整数值。这需要对字符操作和数学运算有一定的理解。
- 回文数检测:判断一个数字或数组是否是回文数需要有一定的算法知识。虽然代码中的
check
函数比较简单,但编写更复杂的回文数检测算法可能会更具挑战性。 - 进位处理:在
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");
}
}
}
}