回文数算法(C和java)

合集下载

java判断回文数的算法

java判断回文数的算法

java判断回文数的算法回文数是指正着读和倒着读都一样的数,例如121、1221等。

在Java中,我们可以使用一些简单的算法来判断一个数是否为回文数。

下面是一个简单的Java代码示例,用于判断一个整数是否为回文数。

```javapublic class PalindromeNumberChecker {public static void main(String[] args) {int number = 121; // 要判断的数if (isPalindrome(number)) {System.out.println(number + "是回文数");} else {System.out.println(number + "不是回文数");}}/*** 判断一个整数是否为回文数** @param number 要判断的整数* @return 是否为回文数*/public static boolean isPalindrome(int number) {// 判断是否为负数或0if (number < 0 || (number % 10 == 0 && number < 100)) {return false; // 不是回文数}// 将整数转换为字符串,逐个字符比较String str = String.valueOf(number);int left = 0;int right = str.length() - 1;while (left < right) {if (str.charAt(left) != str.charAt(right)) { return false; // 不是回文数}left++;right--;}return true; // 是回文数}}```上述代码中,我们首先判断给定的整数是否为负数或0,以及是否为100以内的偶数数字。

java实验报告回文数

java实验报告回文数
}
else
{
System.out.printf("\t%d不是回文数", number);
}
}
else if (【代码6】) //判断number是4位数的条件
{
System.out.printf("\n%d是4位数",number);
If (【代码7】) //判断number是回文数的条件码
{
System.out.printf("\t%d是回文数", number);
32567位数32567不是回文数6实验总结及心得这次实验使我对java程序的编写有了更进一步的了解熟悉掌握了ifelseif多分支语句的运用
《Java程序设计》实验报告
实验二:回文数
专业班级:通信工程2008级1班
姓名:
学号:
时间:
实验二:回文数
1、实验目的:
让学生掌握if-else if多分支语ຫໍສະໝຸດ 。}else{
System.out.printf("\t%d不是回文数", number);
}
}
else if(d2!=0)
{
System.out.printf("\n%d是2位数", number);
if(d1==d2)
{
System.out.printf("\t%d是回文数", number);
}
if(number<=99999&&number>=1)
{
d5=number/10000;
d4=number%10000/1000;
d3=number%1000/100;

回文数(java编程)

回文数(java编程)
System.out.println("你输入的是回文数");
else
System.out.println("你输入的不是回文数");
}
}
这两种方法都能实现对回文数的判断,第一种只能针对整数,第二种似乎能针对所有的字符。
StringBuffer source = new StringBuffer(inputValue);
source.reverse();
String reverseString = new String(source);
if(reverseString.equals(inputValue))
第一种方法的代码如下:
import javax.swing.JOptionPane;
public class Palindrome
{
public static void main(String [] args)
{
String inputValuelog("请输入一个整数");
}
第二种方法的代码如下:
import javax.swing.JOptionPane;
public class PalindromeUseString
{
public static void main(String [] args)
{
String inputValue = JOptionPane.showInputDialog("请输入一个整数");
inputValueLong = inputValueLong/10;
}
if(reverseLong == temp)

回文数

回文数
则否
不必再做
long num=number; //原数 long num_reverse=0; //倒序数 if(num<0) num=0-num; //负数也作判断,先转为正数 if(num>=0 && num<rad) return true; //只有一个数位则直接返回true,
判断回文数

在数学中,也有文学中的回文现象。像回文数就是一 种非常有趣的数。一个自然数,如果从左往右读,或从右 往左读都一样,我们就把这个数称为回文数。比如,121, 48184,8888等都是回文数。 关于回文数,有一个著名的“回文数猜想”:任意写 一个自然数,把它倒过来写成另一个自然数,并将这两个 数相加;然后将所得的和倒过来,与原来的和相加。重复 这一过程,经过有限次运算后,一定会得到一个回文数。 比如,写一个自然数4817,按上述步骤运算: 4817+7184=12001 12001+10021=22022 只经过两步计算,就得到了一个回文数22022。 如果写出的自然数是68,那么,只要经过三步计算就可 得到回文数1111(请你自己写出计算过程)。
回文数 古时候,有一位秀才游桂林名胜之一的斗鸡山。他觉得 山名新奇有趣,不觉哼出一句: “斗鸡山上山鸡斗。” 如果把这算作上联,那下联呢?他怎么也对不上来。秀才 回家后,请自己的启蒙老师对下联。 老师说:“你的上联是回文句,正读反念,其音其义都一 样。我不久前游了龙隐洞,就以此来对吧。”说罢,念道: “龙隐洞中洞隐龙。” 秀才一听,赞叹道:“此乃天赐绝对矣尸 上面的对联称为回文联。 回文,是文学创作中的一种修辞手法。这种修辞手法讲 究语言文字的排列技巧,顺读倒读,流畅自如,给人以一种 循环往复的情趣。请再看一个回文联: 雾锁山头山锁雾, 天连水尾水连天。

回文数

回文数

题目:用户输入一个1~99999之间的整数,程序将判断这个数是几位数,并判断这个数是否是回文数。

回文数是指将该数字逆序排列后得到的数和原数相同。

如:12121,3223。

代码:package com.hjy;import java.util.Scanner;public class Number {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubint number=0,d5,d4,d3,d2,d1;Scanner reader=new Scanner(System.in);System.out.println("从键盘输入一个1至99999之间的数");while(reader.hasNextInt()){number=reader.nextInt();if(0<number&&number<100000){ //判断number在1~99999之前的条件d5=number/10000;//计算number的最高位(万位)d5d4=(number-(d5*10000))/1000;//计算number的千位d4d3=(number-(d5*10000+d4*1000))/100;//计算number的百位d3d2=number%100/10;d1=number%10;if(d5!=0){//判断number是5位数的条件System.out.printf("\n%d是5位数", number);if(d5==d1&&d4==d2)//判断number是回文数的条件System.out.printf("\t%d是回文数", number);elseSystem.out.printf("\t%d不是回文数", number);}else if(d5==0&&d4!=0){//判断number是4位数的条件System.out.printf("\n%d是4位数", number);if(d4==d1&&d2==d3)//判断number是回文数的条件System.out.printf("\t%d是回文数", number);elseSystem.out.printf("\t%d不是回文数", number);}else if(d4==0&&d3!=0){//判断number是3位数的条件System.out.printf("\n%d是3位数", number);if(d2==d1)//判断number是回文数的条件System.out.printf("\t%d是回文数", number);elseSystem.out.printf("\t%d不是回文数", number);}else if(d2!=0){System.out.printf("\n%d是2位数", number);if(d1==d2)//判断number是回文数的条件System.out.printf("\t%d是回文数", number);elseSystem.out.printf("\t%d不是回文数", number);}else if(d1!=0){System.out.printf("\n%d是1位数", number);System.out.printf("\t%d是回文数", number);}} //判断number在1~99999之前的条件结束处elseSystem.out.printf("\n%d不在1至99999之间", number);System.out.printf("%n可继续输入整数或非整数结束程序%n");}//while循环结束处System.out.println("你输入的数据不是整数");}//main()函数结束处}//class结束处运行结果:知识点:If-else-if 多分支语句的应用。

回文数c++语言程序编写

回文数c++语言程序编写

回文数c++语言程序编写回文数是一种特殊的数,它正读和倒读都是一样的。

例如,121、1221、1234321都是回文数。

在C++语言中,我们可以编写程序来判断一个数是否为回文数。

首先,我们可以采取以下步骤来判断一个数是否为回文数:1. 将输入的数转换为字符串类型,方便进行比较2. 使用两个指针,一个指向字符串的开头,一个指向字符串的结尾3. 通过循环比较两个指针所指向的字符是否相等,直到两个指针相遇或者找到了不相等的字符4. 如果找到了不相等的字符,则该数不是回文数;否则,该数是回文数下面是一个使用C++语言编写回文数判断程序的示例代码:```cpp#include <iostream>#include <string>using namespace std;bool isPalindrome(int num) {string str = to_string(num); // 将数转为字符串int left = 0; // 左指针int right = str.length() - 1; // 右指针while (left < right) {if (str[left] != str[right]) {return false; // 找到了不相等的字符,不是回文数}left++;right--;}return true; // 循环结束,是回文数}int main() {int num;cout << "请输入一个数: ";cin >> num;if (isPalindrome(num)) {cout << num << " 是回文数" << endl;} else {cout << num << " 不是回文数" << endl;}return 0;}```以上代码中,首先使用`to_string`函数将输入的数转换为字符串类型。

求回文数算法

求回文数算法

求回⽂数算法问题:求第N个回⽂数palindrome。

⼀个正数如果顺着和反过来都是⼀样的(如13431,反过来也是13431),就称为回⽂数。

约束:回⽂数不能以0开头。

回⽂数从1开始。

⾸先我们要写⼀个算法求回⽂数。

刚开始我想到⽤⽤字符串来存储数,然后判断原序和逆序是否相等。

void func1(char a[]){printf("%d",strlen(a));char *p=a;char *q=a+strlen(a)-1;bool flag=true;while(q>p){if(*q!=*p){flag=false;break;}q--;p++;}if(flag)printf("%s 是回⽂数\n",a);elseprintf("%s 不是回⽂数\n",a);}int main(){char s[50];while(scanf("%s",s)!=0){printf("%d",strlen(s));func1(s);}注意,⽤strlen的时候只检测什么时候到‘\0'位置,与sizeof⽆关,如果是sizeof的话char a[]做函数参数a会降级为指针。

虽然这样做可以,但还是有点⼩问题,如果输⼊010,输出回⽂。

不满⾜回⽂的定义。

回⽂数不能以0开头。

⼀开始就思考使⽤循环:从1开始,判断该数是否是回⽂数,然后⽤⼀个计数器记下回⽂数,⼀直到计数器得到N,返回第N个回⽂数。

⽐较常⽤的是以下这种⽅法来判断是否回⽂数:static boolean isPN(int num) {int o = num;int tmp = 0;//使⽤循环把数字顺序反转while(num != 0) {tmp *= 10;tmp += num % 10;num /= 10;}//如果原始数与反转后的数相等则返回trueif(tmp == o)return true;return false;}这种思路的确可得到正确结果,但随着⽤来测试的N的增⼤,效率的问题就浮现了。

C语言之回文数算法

C语言之回文数算法

C语⾔之回⽂数算法“回⽂”是指正读反读都能读通的句⼦。

它是古今中外都有的⼀种修辞⽅式和⽂字游戏,如“我为⼈⼈,⼈⼈为我”等。

在数学中也有这样⼀类数字有这种特征,成为回⽂数(palindrome number)。

设n是⼀随意⾃然数。

若将n的各位数字反向排列所得⾃然数n1与n相等,则称n为⼀回⽂数。

⽐如,若n=1234321,则称n为⼀回⽂数。

但若n=1234567,则n不是回⽂数。

上代码:#include <stdio.h>#define true 1#define false 0int huiwenshu(int n){int p;p=n;int k=0;//将n进⾏倒序后保存在k这个变量中while(p!=0){k=k*10+p%10;p=p/10;}//推断倒序后的结果k 和原来输⼊的数字n 是否相等,相等返回trueif(k==n)return true;elsereturn false;}int main(void){printf("please input number:\n");static int num ;static int ret ;scanf("%d",&num);ret = huiwenshu(num);if(1 == ret)printf("是回⽂数\n");elseprintf("不是回⽂数\n");return 0 ;}执⾏结果:。

回文数判断

回文数判断

#include<iostream> #include<conio.h> using namespace std; #include<cstring> int j=1;int max=2147483647; long reverse(long s); bool judge(long s) {bool succes=false;if(reverse(s)==s) succes=true; return succes;}long reverse(long s) {long i;for(i=0;s>0;s=s/10) i=i*10+s%10; return i;}long huiwen(long s){if(judge(s)){cout<<"获得的回文数是:"<<s<<endl;return s;}else{cout<<"["<<j++<<"]:"<<s<<"+"<<reverse(s)<<"="<<s+reverse(s) <<endl;if((s+reverse(s))>max||(s+reverse(s))<0){cout<<"在有限的步数内没有找到回文数!"<<endl;return s+reverse(s);}huiwen(s+reverse(s));}}void main(){cout<<"*****************************欢迎使用******************************"<<endl;cout<<"****************回文********××数××********求解*****************"<<endl<<endl;long s;int f,ss=1;while(ss){system("color 2e");cout<<"**********是否要求回文数:*****************"<<endl;cout<<" 1.继续 2.暂停0.退出"<<endl;cout<<">>>>>>>>>>>输入你想要的操作:";cin>>f;switch(f){case 0:ss=0;break;case 1:system("cls");cout<<"请输入一个大于10的数:"<<endl;cin>>s;cout<<"回文数的寻找过程如下:"<<endl;s=huiwen(s);case 2:break;default:cout<<"!!!!!!!!!!!您的输入有误请重新输入:"<<endl;// break;}}cout<<"*****************************谢谢使用******************************"<<endl;cout<<"****************回文********××数××********求解*****************"<<endl<<endl;}//system("cls")//或者。

跟我学Java面向对象程序设计技术及应用——识别某个自然数是否为回文数的Java程序实现示例

跟我学Java面向对象程序设计技术及应用——识别某个自然数是否为回文数的Java程序实现示例
下示图显示具体的定义):设 n 是一任意自然数。若将 n 的各位数字反向排列所得自然数 n1 n 相等,则称 n 为一回文数。
例如,若 n=1234321,则称 n 为一回文数,因为它的 n1=1234321;但若 n=1234567,则 n 不是回文数,因为它的 n1=7654321,但 n1≠n。
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料
1.2.2 在创建的 Java 应用程序项目中添加示例程序类 1、右击所创建的 Java 应用程序项目名称 JavaDemo,在弹出的快捷菜单中选择 New 新建一个 Java 程序类
杨教授工作室,版权所有4 ,盗版必究, 4/23 页
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料
杨教授工作室,版权所有1 ,盗版必究, 1/23 页
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料
1.1.3 如何判断一个自然数是否为回文数 判断一个自然数是否为回文数,可以根据它的定义来设计相关的算法——设 N 是一任意
的自然数,只需要获得 N 的各位数字,然后再将这些数字反向排列组成一个新的数字,这样 所获得的自然数 N1 如果与 N 相等,则可以判断出 N 为一回文数。
2、在工程项目创建的对话框中输入项目名称 JavaDemo,并选择项目存放的目录路径
杨教授工作室,版权所有2 ,盗版必究, 2/23 页
杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料
3、点击对话框中的完成(Finish)按钮,将创建出一个空的 Java 应用程序项目
杨教授工作室,版权所有3 ,盗版必究, 3/23 页
2、在类创建的对话框中输入包名称为 com.bluedream.demo,类名称为 JavaPalindromeNumber, 并选择需要在 JavaPalindromeNumber 类中创建出 main()方法

c++回文的算法思路

c++回文的算法思路

回文是指正读和倒读都一样的字符串,例如"level" 和"radar"。

在C++中,我们可以使用多种方法来检查一个字符串是否是回文。

下面是一些常见的方法:1. **使用比较运算符**:这种方法简单直接。

我们只需比较字符串的第一个和最后一个字符,然后比较第二个和倒数第二个字符,以此类推。

如果所有这些比较都返回true,那么字符串就是回文。

```cppbool isPalindrome(const std::string &str) {int i = 0, j = str.length() - 1;while (i < j) {if (str[i] != str[j]) {return false;}i++;j--;}return true;}```2. **使用STL**:我们可以使用C++ STL中的`std::equal` 算法来比较两个字符串是否相等。

这个算法可以用来检查一个字符串是否是另一个字符串的回文。

```cpp#include <algorithm>#include <string>bool isPalindrome(const std::string &str) {return std::equal(str.begin(), str.end(), str.rbegin());}```3. **使用堆栈**:堆栈是一种后进先出(LIFO)的数据结构,可以用来解决这个问题。

我们可以把字符串的第一个字符压入堆栈,然后依次把剩余的字符压入堆栈。

当我们从堆栈中弹出字符时,我们将得到原始字符串的反向。

如果原始字符串是回文,那么反向字符串也应该是一个回文。

```cpp#include <stack>#include <string>#include <iostream>bool isPalindrome(const std::string &str) {std::stack<char> s;for(const auto &ch: str) {s.push(ch);}while(!s.empty()) {if(s.top() != str[str.size()/2]) {return false;}s.pop();}return true;}```请注意,上述代码片段都没有处理空字符串的情况。

算法笔记_038:特殊回文数(Java)

算法笔记_038:特殊回文数(Java)

算法笔记_038:特殊回⽂数(Java)⽬录1 问题描述问题描述 123321是⼀个⾮常特殊的数,它从左边读和从右边读是⼀样的。

输⼊⼀个正整数n,编程求所有这样的五位和六位⼗进制数,满⾜各位数字之和等于n 。

输⼊格式 输⼊⼀⾏,包含⼀个正整数n。

输出格式 按从⼩到⼤的顺序输出满⾜条件的整数,每个整数占⼀⾏。

样例输⼊52样例输出899998989989998899数据规模和约定 1<=n<=54。

2 解决⽅案2.1 80分解法初步看题,⾃⼰把题意给理解的太深奥了,对于输出的五位数和六位数,我以为00100也是符合要求的五位回⽂数,那么问题就来了,如何输出00100呢?其解法就只能使⽤字符串了,那么使⽤字符串后,问题⼜来了,如何对字符串进⾏从⼩到⼤排序呢?好吧,在这⾥⼜得把字符串转换成整数⽐较⼤⼩,计算排序位置,计算完后,再次输出字符串的顺序。

说到这⾥,我个⼈感觉⾃⼰写的代码虽然复杂,但是计算的结果绝对⽐标答结果全,但是在蓝桥杯练习系统中判分却只有80分,郁闷,不过这次得吸取理解题意的教训了。

具体代码如下:package com.liuzhen.systemExe;import java.util.HashSet;import java.util.Scanner;import java.util.Set;public class Main{public void getReverseN(int n){Set<String> set = new HashSet<String>();for(int i = 0;i < 10;i++){int x1 = i;for(int j = 0;j < 10;j++){int x2 = j;for(int k = 0;k < 10;k++){int x3 = k;if(2*(x1+x2)+x3 == n){char[] temp = new char[5];temp[0] = (char) (x1 + 48);temp[1] = (char) (x2 + 48);temp[2] = (char) (x3 + 48);temp[3] = (char) (x2 + 48);temp[4] = (char) (x1 + 48);String tempS1 = String.valueOf(temp);set.add(tempS1);temp[0] = (char) (x2 + 48);temp[1] = (char) (x1 + 48);temp[2] = (char) (x3 + 48);temp[3] = (char) (x1 + 48);temp[4] = (char) (x2 + 48);String tempS2 = String.valueOf(temp);set.add(tempS2);}if(2*(x1+x2+x3) == n){char[] temp = new char[6];temp[0] = (char) (x1 + 48);temp[1] = (char) (x2 + 48);temp[2] = (char) (x3 + 48);temp[3] = (char) (x3 + 48);temp[4] = (char) (x2 + 48);temp[5] = (char) (x1 + 48);String tempS1 = String.valueOf(temp); set.add(tempS1);temp[0] = (char) (x1 + 48);temp[1] = (char) (x3 + 48);temp[2] = (char) (x2 + 48);temp[3] = (char) (x2 + 48);temp[4] = (char) (x3 + 48);temp[5] = (char) (x1 + 48);String tempS2 = String.valueOf(temp); set.add(tempS2);temp[0] = (char) (x2 + 48);temp[1] = (char) (x1 + 48);temp[2] = (char) (x3 + 48);temp[3] = (char) (x3 + 48);temp[4] = (char) (x1 + 48);temp[5] = (char) (x2 + 48);String tempS3 = String.valueOf(temp); set.add(tempS3);temp[0] = (char) (x2 + 48);temp[1] = (char) (x3 + 48);temp[2] = (char) (x1 + 48);temp[3] = (char) (x1 + 48);temp[4] = (char) (x3 + 48);temp[5] = (char) (x2 + 48);String tempS4 = String.valueOf(temp); set.add(tempS4);temp[0] = (char) (x3 + 48);temp[1] = (char) (x2 + 48);temp[2] = (char) (x1 + 48);temp[3] = (char) (x1 + 48);temp[4] = (char) (x2 + 48);temp[5] = (char) (x3 + 48);String tempS5 = String.valueOf(temp); set.add(tempS5);temp[0] = (char) (x3 + 48);temp[1] = (char) (x1 + 48);temp[2] = (char) (x2 + 48);temp[3] = (char) (x2 + 48);temp[4] = (char) (x1 + 48);temp[5] = (char) (x3 + 48);String tempS6 = String.valueOf(temp); set.add(tempS6);}}}}int len = set.size();String[] result = new String[len];int i = 0;for(String tem : set)result[i++] = tem;int[] rI = getSort(result);for(i = 0;i < len;i++){int k = getMinI(rI);System.out.println(result[k]);rI[k] = len;}}public int[] getSort(String[] A){int len = A.length;int[] result = new int[len];int[] tempResult = new int[len];for(int i = 0;i < len;i++){tempResult[i] = Integer.parseInt(A[i]);}for(int i = 0;i < len;i++){int count = 0;for(int j = 0;j < len;j++){if(tempResult[i] > tempResult[j])count++;}result[i] = count;}return result;}public int getMinI(int[] A){int result = 0;for(int i = 0;i < A.length;i++){if(A[result] > A[i])result = i;}return result;}public static void main(String[] args){//long t1 = System.currentTimeMillis();Main test = new Main();Scanner in = new Scanner(System.in);System.out.println("请输⼊⼀个10进制整数:");int n = in.nextInt();test.getReverseN(n);//long t2 = System.currentTimeMillis();//System.out.println("耗时:"+(t2-t1)+"毫秒");}}运⾏结果:请输⼊⼀个10进制整数:100100请输⼊⼀个10进制整数:2002000101000110010001010010100001请输⼊⼀个10进制整数:528999989899899988992.2 ⽹友标答解法具体代码如下:package com.liuzhen.array_2;import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("请输⼊数字n:");int n=input.nextInt();ArrayList<Integer> rs= new ArrayList<Integer>();for(int i=1; i<10; i++)for(int j=0; j<10; j++)for(int k=0; k<10; k++){if(2*i+2*j+k==n)rs.add(i*10000 + j*1000 + k*100+ j*10 + i);if(2*i+2*j+2*k==n)rs.add(i*100000 + j*10000+ k*1000 + k*100+ j*10 + i); }Collections.sort(rs);for(int i=0; i< rs.size(); i++)System.out.println(rs.get(i));}}运⾏结果:请输⼊数字n:1请输⼊数字n:210001100001请输⼊数字n:52899998989989998899。

回文数总结

回文数总结

回文数总结什么是回文数回文数指的是正读和反读都相同的整数。

例如,121,1221都是回文数。

回文数的判断方法回文数的判断方法有多种,下面介绍两种常见的方法。

方法一:将整数转为字符串进行比较将整数转为字符串,然后判断该字符串与其反转后的字符串是否相等。

示例代码:def is_palindrome(num):num_str = str(num)return num_str == num_str[::-1]方法二:数字逆转进行比较将整数倒序,然后与原整数进行比较。

如果两者相等,则为回文数。

示例代码:def is_palindrome(num):rev =0temp = numwhile temp >0:rev = rev *10+ temp %10temp = temp //10return rev == num判断一个数字区间内的回文数个数给定一个数字区间[start, end],编写函数count_palindrome(start, end)来计算该区间内的回文数个数。

示例代码:def count_palindrome(start, end):count =0for num in range(start, end +1):if is_palindrome(num):count +=1return count优化:减少判断次数在判断回文数时,可以观察到一个规律:回文数的后半部分应该与前半部分相同。

例如,对于数字 1221,可以将其拆分为前半部分 12 和后半部分 21,后半部分的数字通过逆转前半部分得到。

利用这个规律,我们可以通过减少判断次数来优化代码。

示例代码:def is_palindrome(num):if num <0or (num %10==0and num !=0):return Falsereverse_num =0while num > reverse_num:reverse_num = reverse_num *10+ num %10num = num //10return num == reverse_num or num == reverse_num //10def count_palindrome(start, end):count =0for num in range(start, end +1):if is_palindrome(num):count +=1return count总结回文数是指正读和反读都相同的整数。

寻找字符串中最长回文——Manacher算法及其Java实现(POJ

寻找字符串中最长回文——Manacher算法及其Java实现(POJ

寻找字符串中最长回⽂——Manacher算法及其Java实现(POJ 3974)题⽬:给⼀个字符串,找出最长的回⽂的长度(或求这个回⽂)。

题⽬分析:分析寻找字符串中的回⽂,有特定的算法来解决,也是本⽂的主题:Manacher算法,其时间复杂度为O(n)。

⾸先在每两个相邻字符中间插⼊⼀个分隔符,当然这个分隔符要在原串中没有出现过。

⼀般可以⽤‘#’分隔。

这样就⾮常巧妙的将奇数长度回⽂串与偶数长度回⽂串统⼀起来考虑了。

然后,我们需要⼀个辅助数组rad[],⽤rad[i]表⽰第i个字符的回⽂半径,rad[i]的最⼩值为1,即只有⼀个字符的情况,现在问题转变成如何求出rad数组。

假设现在求出了rad[1, ..., i],现在要求后⾯的rad值,再假设现在有个指针k,从1循环到rad[i],试图通过某些⼿段来求出[i + 1, i + rad[i] - 1]的rad值,其分析如下:如图1所⽰,⿊⾊的部分是⼀个回⽂⼦串,两段红⾊的区间对称相等。

因为之前已经求出了rad[i - k],所以可以避免⼀些重复的查找和判断,有3种情况:图1① rad[i] - k < rad[i - k]如图1,rad[i - k]的范围为青⾊。

因为⿊⾊的部分是回⽂的,且青⾊的部分超过了⿊⾊的部分,所以rad[i + k]肯定⾄少为rad[i]-k,即橙⾊的部分。

那橙⾊以外的部分就不是了吗?这是肯定的,因为如果橙⾊以外的部分也是回⽂的,那么根据青⾊和红⾊部分的关系,可以证明⿊⾊部分再往外延伸⼀点也是⼀个回⽂⼦串,这肯定是不可能的,因此rad[i + k] = rad[i] - k。

② rad[i] - k > rad[i - k]如图2,rad[i-k]的范围为青⾊,因为⿊⾊的部分是回⽂的,且青⾊的部分在⿊⾊的部分⾥⾯,根据定义,很容易得出:rad[i + k] = rad[i - k]。

根据上⾯两种情况,可以得出结论:当rad[i] - k != rad[i - k]的时候,rad[i + k] = min(rad[i] - k, rad[i - k])。

c语言描述回文数的三种算法

c语言描述回文数的三种算法

c语⾔描述回⽂数的三种算法题⽬描述注意:(这些回⽂数都没有前导0)1位的回⽂数有0,1,2,3,4,5,6,7,8,9 共10个;2位的回⽂数有11,22,33,44,55,66,77,88,99 共9个;* 请问:n位的回⽂数有多少个?请编写⼀个递归函数来解决此问题【输⼊形式】⼀⾏⼀个正整数,代表多少位【输出形式】⼀⾏⼀个正整数,代表回⽂诗的个数【样例输⼊】2【样例输出】9输⼊:3输出:90输⼊:5输出:900**输⼊:10输出:90000**输⼊:8输出:9000输⼊:1输出:10思路分析通过for循环读⼊这个数,通过/和%操作将这个数据逆转,然后再对⽐逆转后的数字是否和原数字相等通过for循环读⼊这个数,每次取头位⼀个数字和末位⼀个数字,依次⽐较这两个数字是否相等,再去掉这两个数字,直到剩下⼀个数字(位数为奇数)或者剩下两个数字(位数为偶数)通过数学关系,直接判断位数,算出这个位数内的回⽂数个数;例如:99899可以把它分为两半,取前⾯⼀半998,如果是回⽂数,其后⾯⼀半⼀定是与其相应位置对应,998为3位数字,**除第⼀位(不包含前导0)故与后半对应的位置那个数有9种选择(1-9)外,其他位都与相应的位置有10种选择(0-9)**,例如第⼆位和倒数第⼆位(0-9)所以可以总结出来相同的位数,位数为奇数奇数其回⽂数有9*10^(n/2)个,注意n/2是整数,位数为偶数的为910^(n/2-1)个,所以5位数字的的回⽂数有910*10=900个注意位数为1有10个(0-9),需要特殊处理代码描述1. 第⼀种思路:#include <stdio.h>#include <math.h>int reverse(long int i,long int *terminate) //递归函数求数值的逆序{if (i<=0){ //递归出⼝return 1;}else{*terminate*=10; //每次乘10升位数*terminate+=i%10; //加上个位reverse(i/10,terminate); //递归每次规模缩⼩}return 1;}int main (){int n;scanf ("%d",&n); //读⼊⼀个n,表⽰n位整数long int i;int count=0;if (n==1){ //如果等于1,则有10个(0-9都是),特殊处理;printf ("10");return 0;}for (i=pow(10,n-1);i<pow(10,n);i++){ //从第⼀个n位数开始(10^(n-1)),到(10^n)-1long int terminate=0; //定义⼀个逆序⽬标数reverse(i,&terminate); //把i和逆序⽬标数传⼊if (terminate==i){ //逆序后还和原数相等,则可计数count++;}}printf ("%d",count); //输出个数return 0;}2. 第⼆种思路:#include <stdio.h>#include <math.h>int judge(int i,int n){int first,last;if (n<=1){ //规模减⼩,直到n为1(偶数)或者0return 1;}else{first=i/pow(10,n-1); //头位数字last=i%10; //末位数字if (first!=last){ //头位末尾不⼀样直接退出return 0;}int tem=pow(10,n-1);judge(i%tem/10,n-2); //剔除头尾剩下中间,位数减⼆}}int main (){int n;scanf("%d",&n);if (1==n){printf ("10");return 0;}int i;int count=0;long long low=pow(10,n-1); //循环⼊⼝long long high=pow(10,n); //循环出⼝for (i=low;i<high;i++){if ( judge(i,n)==1){ //判断i是否为回⽂,计数count++;}}printf ("%d",count);return 0;}3. 第三种思路:#include <stdio.h>#include <math.h>int main (){int n;scanf ("%d",&n);int ji=9*pow(10,n/2),ou=9*pow(10,n/2-1);if (n==1){printf ("10");}else if (n==2){printf ("%d",9);}else if (n%2==1){printf ("%d",ji);}else if (n%2==0){printf("%d",ou);}return 0;}额外疑问第⼀第⼆种⽅法当n=10的时候运算不出来,求解为何如此,是时间复杂度太⾼了吗?还是爆int了或者爆递归了?以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

c语言回文数的判断

c语言回文数的判断

c语言回文数的判断回文数是指正着读和倒着读都一样的数字,比如121、1221等。

在C语言中,判断一个数是否为回文数可以通过以下步骤实现:1. 将输入的数字转换成字符串类型,方便进行字符比较。

2. 使用strlen函数获取字符串的长度,以便后续进行字符比较。

3. 使用for循环遍历字符串,比较第i个字符和第n-i-1个字符是否相等,其中n为字符串长度。

4. 如果所有字符都相等,则该数字为回文数,否则不是。

下面是一个简单的C语言程序,用于判断一个数是否为回文数:```#include <stdio.h>#include <string.h>int main(){int num;char str[20];int i, n;int flag = 1;printf("请输入一个数字:");scanf("%d", &num);sprintf(str, "%d", num);n = strlen(str);for (i = 0; i < n / 2; i++){if (str[i] != str[n - i - 1]){flag = 0;break;}}if (flag)printf("%d是回文数\n", num); elseprintf("%d不是回文数\n", num);return 0;}```在上面的程序中,我们首先使用sprintf函数将输入的数字转换成字符串类型,然后使用strlen函数获取字符串的长度。

接着,我们使用for循环遍历字符串,比较第i个字符和第n-i-1个字符是否相等,如果不相等,则将flag标志设置为0,并跳出循环。

最后,根据flag标志的值输出结果。

需要注意的是,上面的程序只能判断正整数是否为回文数,如果需要判断负整数或小数是否为回文数,需要进行额外的处理。

三重回文数字c语言

三重回文数字c语言

三重回文数字c语言三重回文数字是指在三位数中,百位、十位和个位上的数字分别相同,并且这个数字是回文数。

例如,121、232和343都是三重回文数字。

下面是一个使用C语言编写的程序,用于检查给定的三位数是否为三重回文数字:```cinclude <>include <>bool isPalindrome(int n) {int reversed = 0, original = n, remainder;while (n != 0) {remainder = n % 10;reversed = reversed 10 + remainder;n /= 10;}return original == reversed;bool isTriplePalindrome(int n) {int hundreds = n / 100;int tens = (n % 100) / 10;int ones = n % 10;return isPalindrome(hundreds) && isPalindrome(tens) && isPalindrome(ones);}int main() {int num;printf("请输入一个三位数:");scanf("%d", &num);if (num >= 100 && num <= 999 && isTriplePalindrome(num)) { printf("%d是三重回文数字。

\n", num);} else {printf("%d不是三重回文数字。

\n", num);}return 0;}这个程序首先定义了一个函数isPalindrome(),用于检查一个整数是否是回文数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
tmp *= 10;
tmp += num % 10;
num /= 10;
}
//如果原始数与反转后的数相等则返回true
if(tmp == o)
return true;
return false;
个计数器记下回文数,一直到计数器得到N,返回第N个回文数。比较常用的是以下这种方法来判断是
否回文数:
static boolean isPN(int num) {
int o = num;
int tmp = 0;
//使用循环把数字顺序反转
while(num != 0) {
问题:
将所有回文数从小到大排列,求第N个回文数。
一个正数如果顺着和反过来都是一样的(如13431,反过来也是13431),就称为回文数。约束:
回文数不能以0开头。
最小回文数是1。
思路:
许多朋友(包括我自己)一开始就思考使用循环:从1开始,判断该数是否是回文数,然后用一
}
这种思路的确可得到正确结果,但随着用来测试的N的增大,效率的问题就浮现了。因为是一重
循环,效率是O(n)。所以当N非常大时,所花的时间还是十分大的。
另一种思路:
回文数的个数其实是有规律的。如:
1位回文数: 9个
2位回文数: 9个
3位回文数: 90个
res = res *10 + half % 10;
half /= 10;
}
return res;
}
全部代码:
public class PalindromicNumber {
public static void main(String[] args) {
long h = 1; //回文数的左半边的起始基数
long res; //结果
while(true) {
if(w > 0 && w%2 == 0) { //每进两个数位,回文数乘以10
count += number; //回文数加上当前数位上的回文数
}
index -= count; //在当前数位上的位置。如w=5,index=50,则万位上的第50个回文数是我们所求
for(int i = 0; i < (w-1) / 2; i++) { //求回文数的左半边的基数,如回文数在万位上,则为100
h *= 10;
}
half = h + index; //回文数的左半边,如100 + 50 = 150
res = half;
if(w%2 != 0) //如果为奇数,则中间那个数不必算入右半边了!
number *= 10;
}
w++; //数位加一
if(count + number > index) //回文数大于查找的回数,跳出
break;
核心代码:
static long find(int index) {
int count = 0;
int number = 9; //记录数位上的回文数,如个位回文数为9
int w = 0; //记录数位
4位回文数: 90个
5位回文数: 900个
6位回文数: 900个

我们看到9、90、900,是不是很有规律,那是什么原因?很简单,我们把回文数拆开两半
[123321]来看。两半的变化一样的,那我们只算其中一半就行了。首位不能是0,所以左半最小为
int input = Integer.parseInt(args[0]);
long res = find(input);
System.out.println("res:" + res);
}
static long find(int index) {
if(w%2 != 0) //如果为奇数,则中间那个数不必算入右半边了!
half /=10;
while(half != 0) { Nhomakorabea //拼接回文数
while(true) {
if(w > 0 && w%2 == 0) { //每进两个数位,回文数乘以10
number *= 10;
}
w++; //数位加一
int count = 0;
int number = 9; //记录数位上的回文数,如个位回文数为9
int w = 0; //记录数位
long half; //保存回文数的左半边的结果
}
index -= count; //在当前数位上的位置。如w=5,index=50,则万位上的第50个回文数是我们所求
for(int i = 0; i < (w-1) / 2; i++) { //求回文数的左半边的基数,如回文数在万位上,则为100
h *= 10;
}
half = h + index; //回文数的左半边,如100 + 50 = 150
res = half;
half /=10;
while(half != 0) { //拼接回文数
res = res *10 + half % 10;
half /= 10;
}
if(count + number > index) //回文数大于查找的回数,跳出
break;
count += number; //回文数加上当前数位上的回文数
long half; //保存回文数的左半边的结果
long h = 1; //回文数的左半边的起始基数
long res; //结果
100,最大为999,共有999-100+1=900个,如此类推。
所以我们可以基于以下原则:
1、 回文数的数位每增长2,回文数的个数为原来的10倍。如从个位回文数到百位回文数,个数
从9个变为90个。
2、 个位回文数的个数是9,1、2、3、…、9。
总之理解原理后一切好办,步骤就偷懒不写了,看代码吧!
return res;
}
}
相关文档
最新文档