(C/C++/Java)判断中文、字符串、数字是否为“回文”
(C语言)判断中文是否为回文 (例如:上海自来水来自海上)。回文即两端对称的一种结构,可以是数字,如 123321;可以是字符,如: asdfdsa;也可以是中文 ,如:上海自来水来自海上。那么数字我们可以读取每个位置上的数进行比较;字符可以逐个读取字符判断;那么中文呢?由于在不同的编码方式,存储汉字所占的字节数不同,因此判断中文是否是回文时虽然也是分别对比,但是对字节数的变动需特别注意。
写在前面
本文是进行 “回文检测” 方式的分析,分别用: C / C++ / Java 语言实现,其中每种语句 分别实现对 “数字 、字符串 、 中文 ” 是否为“回文”的判断,篇幅较长,根据自己需求耐心看哦。
(可以根据 “目录” 进行快速选择)
一、问题分析
1.先了解一下什么是“回文结构”?
摘自百度百科给出的解释: “回文”是指正读反读都能读通的句子,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。
简单的说:即两边对称内容相同的一种结构。
如:数字 12321
如:字符 asdfdsa
如: 中文 上海自来水来自海上
2.分析一下 使用什么方法判断 “数字、字符串、中文”是否为 “回文” ?
(1) 数字
对于数字,如 12321,那么判断是否为回文必然要对 1 1,2 2进行比较才行,因此我们很容易考虑到“采用 求模、取余 的方法得到每位数字”,以此进行比较,判断是否为回文,那么现在的“关键问题”就变成了:“如何取出每位数字” ?
如果单独操作数字,我们则可以考虑到 取模、取余计算得到每位数字,如下图取出每位数字分别进行对比。

如果可以借助 数组,将数字存储在 数组中,那么判断起来将会更方便,如下所示。
过程简略描述:
int num[5]={1,2,3,2,1};
num[0]=1
num[1]=2
num[2]=3
num[3]=2
num[4]=1//这里近表述 过程 ---------- >>>>>> 具体见代码实现部分
if num[0]==num[4] && num[3]==num[1] ---> 是回文
当然还有其他方式实现检索,再次仅举两例,具体参见代码部分内容。
(2) 字符串
对于字符串如果使用C/C++我们可以借助数组进行判断,若使用Java,则可使用相关函数获取每个字符进行比较,具体内容见代码实现部分,有具体的语句注释可理解。
(3)中文(重点)
对“中文”是否为 回文 的判断是一个需要特别关注的问题,一般情况下我们往往会考虑到也是直接取汉字字符进行判断就可以了 ?
显然,这是一个“ 误区 ”,因为在不同操作系统、语言中,“ 汉字 ”采用的“ 编码方式不同 ”,则 “汉字”占用的“字节数”则不同。
那么我们如何进行判断呢 ?
当然,我们采用数组的形式,以字符串方式存入汉字,之后一一进行比较,与普通字符串比较所不同的在于:汉字 占用的字节数不同,那么我们比较一个汉字等价于比较汉字每个字节的内容是否相同。(这点很关键,必须要注意到!)
那么,不同编码方式下的汉字分别占多少字节 ?
如下表所示,其中ASCII、GBK(如DEVC++默认使用这种编码方式)、UTF-8(目前比较主流的编码方式)比较常见。
| 编码类型 | 中文(汉字) | 英文(字母) |
| ASCII | 2 | 1 |
| GBK | 2 | 1 |
| UTF-8 | 3 | 1 |
| Unicode | 2 | 2 |
| GB2312 | 2 | 2 |
| GB18030 | 2 | 1 |
| UTF-16BE | 2 | 2 |
| UTF-16LE | 2 | 2 |
那么接下来考虑一个问题,字符编码是和什么相关而定的:取决于所使用的“编辑工具”使用的编码方式来决定的,比如 DevC++工具中默认使用 GBK 编码格式,因此存储一个汉字需要用到 2 字节,若是你修改为 UTF-8 编码方式则存储一个汉字用到 3 字节。(GBK 还是 UTF-8 或其他 很关键:决定了进行汉字判断的时候 汉字的比较 你要用到几个字节的内容比较才行)。
根据上面的内容,你需要看一看自己的编辑工具所采用的编码方式是什么格式,若没有进行或修改,则 C/C++ 使用 DEVC++ 编辑工具则默认为 GBK编码格式(一个汉字 占 2字节),Java 使用IDEA 或 Eclipse 编辑工具默认的也是 GBK编码格式(一个汉字 占 2字节),因此这就明确了进行汉字比较的时候一个汉字要比对几个字节的内容。
(Java可以直接用字符串表示,更好实现,具体见 Java 代码实现内容)
二、C语言实现
1.判断 数字 是否为 回文
(1)代码
#include<stdio.h>
#include<stdlib.h>
//判断
int check(int number){
//负数一定不是 回文数
if(number<0){
return 0;//结束,如: -1221 ,虽然1221是回文数,但是有 负号- ,所以比对为 - 和 2 不相等,因此必然不是
}
//单个数字
if(number>0 && number<10){
return 1;//如: 1 ,只有一个数,无需判断
}
//多个数字--->采用 求模、取余方式 获取对于位置上的 数字进行比较
int divisor = 1;//除数
//每次 front、rear对比
int front = 0;//第1个数
int rear = 0;//最后1个数
//1.计算 divisor
while(number/divisor>=10){
divisor*=10;
//根据number位数决定 divisor位数
//如:number=123 ,那么必须 divisor=100,才能得到 number/divisor=123/100=1,得到 头部第1个数
}
//进行数字比较
while(number>0) {
front = number / divisor;//第1位数
rear = number % 10;//最后1位数
//只要有一个数字不同就不是回文,退出
if(front!=rear){
return 0;
}
//重新计算 X 值 ,去掉比对过的 2 个数
//eg:1221,1 1 对比过,现在取 22 ,然后对 22 进行比较
number = (number % divisor) / 10;
//每次减少2位数,divisor缩小为原来的 1/100
//比如:1221,比对1 1 时divisor=1000,取 22 时 divisor=10 才能确保取到头部数字 2
divisor=divisor/100;
}
return 1;//是回文数
}
int main(){
int a;
printf("输入一个数字:");
if(check(scanf("%d",&a))){
printf("%d 是回文数",a);
}else{
printf("%d 不是回文数",a);
}
return 0;
}
(2)运行结果

2.判断 字符串 是否为 回文
(1) 代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//检测回文
int check(char string[]){
for (int i = 0; i < (strlen(string) / 2); i++) {
if(string[i]!= string[strlen(string) - 1 - i]) {
return 0; //有一个字符不相等则不是回文
}
}
return 1;
}
int main(){
char string[100];
printf("请输入字符串:");
gets(string);
if(check(string)) {
printf("是回文");
}else {
printf("不是回文");
}
return 0;
}
(2)运行结果
3.判断 中文 是否为 回文
(1)代码
这里很关键,注意 默认的编码格式是 GBK,一个汉字占 2 字节,见代码中的注释。
//导入头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//主函数
int main(){
int i,j;
char string[100];
printf("请输入中文语句:\n");
gets(string);//获取字符串
printf("%s",string);//输出字符串信息
int len=strlen(string);//获取字符串长度
int yes=0;
for(i=0,j=len-1;i<len/2;i+=2,j-=2){
//GBK编码 一个汉字占 2字节,每次取 2 个字节内容相当于比较一个汉字
if(string[i]==string[j-1] && string[i+1]==string[j]){
yes=1;
}else{
yes=0;//不想等则退出,不是回文
break;
}
}
if(yes){
printf(" 是回文\n");
}else{
printf(" 不是回文\n");
}
return 0;
}
(2)运行结果


三.C++语言实现
1.判断 数字 是否为 回文
(1)代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//判断
int check(int number){
//负数一定不是 回文数
if(number<0){
return 0;//结束,如: -1221 ,虽然1221是回文数,但是有 负号- ,所以比对为 - 和 2 不相等,因此必然不是
}
//单个数字
if(number>0 && number<10){
return 1;//如: 1 ,只有一个数,无需判断
}
//多个数字--->采用 求模、取余方式 获取对于位置上的 数字进行比较
int divisor = 1;//除数
//每次 front、rear对比
int front = 0;//第1个数
int rear = 0;//最后1个数
//1.计算 divisor
while(number/divisor>=10){
divisor*=10;
//根据number位数决定 divisor位数
//如:number=123 ,那么必须 divisor=100,才能得到 number/divisor=123/100=1,得到 头部第1个数
}
//进行数字比较
while(number>0) {
front = number / divisor;//第1位数
rear = number % 10;//最后1位数
//只要有一个数字不同就不是回文,退出
if(front!=rear){
return 0;
}
//重新计算 X 值 ,去掉比对过的 2 个数
//eg:1221,1 1 对比过,现在取 22 ,然后对 22 进行比较
number = (number % divisor) / 10;
//每次减少2位数,divisor缩小为原来的 1/100
//比如:1221,比对1 1 时divisor=1000,取 22 时 divisor=10 才能确保取到头部数字 2
divisor=divisor/100;
}
return 1;//是回文数
}
int main(){
cout<<"输入一个数字:";
int a;
cin>>a;
if(check(a)){
cout<<a<<"是回文数";
}else{
cout<<a<<"不是回文数";
}
return 0;
}
(2)运行结果

2.判断 字符串 是否为 回文
(1)代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
//检测回文
int check(char string[]){
for (int i = 0; i < (strlen(string) / 2); i++) {
if(string[i]!= string[strlen(string) - 1 - i]) {
return 0; //有一个字符不相等则不是回文
}
}
return 1;
}
int main(){
char string[100];
cout<<"请输入字符串:";
gets(string);
if(check(string)) {
cout<<"是回文";
}else {
cout<<"不是回文";
}
return 0;
}
(2)运行结果
3.判断 中文 是否为 回文
(1)代码
这里很关键,注意 默认的编码格式是 GBK,一个汉字占 2 字节,见代码中的注释。
//导入头文件
#include<iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
//主函数
int main(){
int i,j;
char string[100];
cout<<"请输入中文语句:\n";
gets(string);//获取字符串
cout<<string;//输出字符串信息
int len=strlen(string);//获取字符串长度
int yes=0;
for(i=0,j=len-1;i<len/2;i+=2,j-=2){
//GBK编码 一个汉字占 2字节,每次取 2 个字节内容相当于比较一个汉字
if(string[i]==string[j-1] && string[i+1]==string[j]){
yes=1;
}else{
yes=0;//不想等则退出,不是回文
break;
}
}
if(yes){
cout<<"是回文\n";
}else{
cout<<"不是回文\n";
}
return 0;
}
(2)运行结果


四. Java 语言实现
1.判断 数字 是否为 回文
(1)代码
package homework;//包名
import java.util.Scanner;
//类体
public class Number {
// 判断
public static boolean check(int number) {
// 负数一定不是 回文数
if (number < 0) {
return false;// 结束,如: -1221 ,虽然1221是回文数,但是有 负号- ,所以比对为 - 和 2 不相等,因此必然不是
}
// 单个数字
if (number > 0 && number < 10) {
return true;// 如: 1 ,只有一个数,无需判断
}
// 多个数字--->采用 求模、取余方式 获取对于位置上的 数字进行比较
int divisor = 1;// 除数
// 每次 front、rear对比
int front = 0;// 第1个数
int rear = 0;// 最后1个数
// 1.计算 divisor
while (number / divisor >= 10) {
divisor *= 10;
// 根据number位数决定 divisor位数
// 如:number=123 ,那么必须 divisor=100,才能得到 number/divisor=123/100=1,得到 头部第1个数
}
// 进行数字比较
while (number > 0) {
front = number / divisor;// 第1位数
rear = number % 10;// 最后1位数
// 只要有一个数字不同就不是回文,退出
if (front != rear) {
return false;
}
// 重新计算 X 值 ,去掉比对过的 2 个数
// eg:1221,1 1 对比过,现在取 22 ,然后对 22 进行比较
number = (number % divisor) / 10;
// 每次减少2位数,divisor缩小为原来的 1/100
// 比如:1221,比对1 1 时divisor=1000,取 22 时 divisor=10 才能确保取到头部数字 2
divisor = divisor / 100;
}
return true;// 是回文数
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("输入一个数字:");
int a = input.nextInt();
if(check(a)){
System.out.println("是回文数");
}else{
System.out.println("不是回文数");
}
}
}
(2)运行结果

2.判断 字符串 是否为 回文
(1)代码
package homework;//包名
import java.util.Scanner;
public class Palindrome {
//检测回文
public static boolean check(String s) {
boolean is = true;//开关
for (int i = 0; i < (s.length() / 2); i++) {
if(s.charAt(i) != s.charAt(s.length() - 1 - i)) {
return false; //有一个字符不相等则不是回文
}
}
return is;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入字符串:");
String s = input.next();
if(check(s)) {
System.out.println(s + " 是回文");
}else {
System.out.println(s + " 不是回文");
}
}
}
(2)运行结果

3.判断 中文 是否为 回文
(1)代码
package homework;//包名
import java.util.Scanner;
public class Chinese {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("输入 中文语句:");
String s = input.next();
boolean yes = false;
int i;
int j = s.length()-1;
for(i=0;i<s.length()/2;i+=2,j-=2){
//这里我们直接 使用 字符串取对于字符,不采用数组会更加方便
if(s.charAt(i)==s.charAt(j)){
yes=true;
}else{
yes=false;//不想等则退出,不是回文
break;
}
}
if(yes){
System.out.println("是回文");
}else{
System.out.println("不是回文");
}
}
}
(2)运行结果

更多推荐

所有评论(0)