C语言判断回文数的几种方法。

回文数:正读倒读都一样的整数。
回文字符串:指从左到右读和从右到左读完全相同的字符串。

下面说几种判断回文的方法。

方法一 通过字符串数组来判断回文
思路:使用两个数组,将整数转换成字符串,然后反着赋值给另一个数组,对比原数组和新数组是否一样。如果一样就是回文,反之不是。(这种方法有点沙雕而且局限性好大我感觉!!!)

(只能用来判断18位以内的整数!!!)

#define _CRT_SECURE_NO_WARNINGS //这一句是避免C99错误的 vs2019使用scanf会报错c99
#include
#include
void main()
{
	char str[19];//定义字符数组str用存放输入的值。(最多判断18位,多了下标越界异常)。最后一个要存放结束符'\0'
	char fanstr[19];//定义字符数组fanstr用来存放翻转的值。
	long long int a = 0;//用一个变量a来存放输入的数据
	printf("请输入一串整数用来判断是否是回文\n");
	scanf("%lld", &a);//longlong int是范围9223372036854775807(19位)为了防止数值越界,我们前面定义数组只用18位
	sprintf(str, "%lld", a);//sprintf()/将a转为字符串输入到str中 ,printf()格式化输出的屏幕,sprint()是格式化输出到指定的地方。
	int n = strlen(str);//strlen 用来统计字符串的长度,遇到"\0"结束。
  //printf("%s", str);//(这一步用来调试的,可以看到str里已经有了刚刚输入的字符串。
	fanstr[n] = '\0';//为fanstr在最后添加一个字符串结束符。

	for (int i = 0, j = n - 1; i < n; i++, j--)
	{
		fanstr[j] = str[i]; //开始反转赋值
	}
	//	printf("%s", fanstr); //这句话是打印看一下啊赋值结果对不对
	 //开始对比原数组和反转后的数组是否一样。
	//这里可以用for循环来进行判断,也可以使用一个strstrcmp函数来进行判断。
	if (strcmp(fanstr, str) == 0)
		printf("%s是回文", str);
	else
		printf("%s不是回文", str);



}

改进版: 可以判断字符串和整数
既然是输入,那直接可以用一个gets来接收所输入的字符啊,这样貌似可以不用区别是输入的是整数还是字符。

void main()
{
	char str[999];//定义字符数组str用存放输入的字符串。
	char fanstr[999];//定义字符数组fanstr用来存放翻转的字符串。
	printf("请输入一串字符用来判断是否是回文\n");
	gets(str);
	int n = strlen(str);//strlen 用来统计字符串的长度,遇到"\0"结束。
//	printf("%s", str);//(这一步用来调试的,可以看到str里已经有了刚刚输入的字符串。
	fanstr[n] = '\0';//为fanstr在最后添加一个字符串结束符。
	for (int i = 0, j = n - 1; i < n; i++, j--)
	{
		fanstr[j] = str[i]; //开始反转赋值
	}
	//	printf("%s", fanstr); //这句话是打印看一下啊赋值结果对不对
	 //开始对比原数组和反转后的数组是否一样。
	//这里可以用for循环来进行判断,也可以使用一个strstrcmp函数来进行判断。
	if (strcmp(fanstr, str) == 0)
		printf("%s是回文", str);
	else
		printf("%s不是回文", str);
}

方法二:(只能用来确定整数)
任何一个数除以10的余数就是该数最后一位
任何一个数除以10的商就是排除掉最后一位后的数
新数=新数*10+余数
经过循环后,我们得到新数
如果是回文,那么新数应该等于原数,否则不是回文
假如有一个数字121

第一轮循环:
sum=0*10+121%10=1
temp=121/10=12
第二轮循环
sum=1*10+12%10=12
temp=12/10=1
第三轮循环
sum=12*10+1%10=121
temp=1/10=0
第四轮循环判断
temp=0 退出循环
最后判断 121=121是回文

若有个数字是123
第一轮循环:
sum=0*10+123%10=3
temp=123/10=12
第二轮循环:
sum=3*10+12%10=32
temp=12/10=1
第三轮循环:
sum=32*10+1%10=321
temp=1/10=0
第四轮循环判断
temp=0退出循环
321!=123不是回文
void main() {
	int num, temp, sum = 0; 
	printf("请输入一个数\n");
	scanf("%d", &num);
	temp = num;
	
	while (temp != 0) { 
		sum = sum * 10 + temp % 10;    
		temp= temp / 10;				  
	}
	if (sum == num&&num>0)  //新数和原数相等并且原数不为负数的时候才为回文
	{
		printf("%d是回文\n", num);
	}
	else
	{
		printf("%d不是回文!\n", num);
	}
}

说到这里,突然又想来试试看看能不能把回文数打印出来,我要打印100-1000的回文数。

打印回文数

void main() {
	int num, temp; int sum = 0;

	for (num = 101; num < 1000; num++) {//通过循环来赋初值
		temp = num;
		//每判断一个数之后 sum一定要回初始值,不然第一个101判断完了102就变成了101*10+2就是错的了。
		//这个问题,我还是通过单步调试找出来的,哎要是笔试就蒙了
		sum = 0;
		while (temp != 0)
		{
			sum = sum * 10 + temp % 10;
			temp = temp / 10;
		}
		if (sum == num && num > 0)
		{
			printf("%d\n", num);
		}
	}

}

我也是只是一个初学者,若有问题,请大家指出!

你可能感兴趣的:(C)