No.26 我与代码的日常:逆转整数,回文字符串,回文数字,查询数组中遗漏数字,判断2的幂

学习不易,需要坚持。

  1. 逆转整数:Reverse Integer

    Example1: x = 123, return 321
    Example2: x = -123, return -321
    处理溢出: 比如整数最大值2147483647逆转之后的整数值不存在
    要求所有值逆转之后再判断是否溢出

  2. 判断一个字符串是否为回文字符串:abcdcba
    要求:不能使用额外数组,额外字符串

  3. 判断一个数字是否为回文数(负数不是回文数)
    要求:不能使用额外数组,不允许计算中出现溢出

  4. 从0到n之间取出n个数,找出漏掉的那个数,这n个数乱序
    要求:不使用额外数组

  5. 给出一个整数,判断它是否是2的幂

//逆转一个整数,考虑溢出情况(返回0)
#include <stdio.h>

int reverse_int(int n)
{
	int max = 0x7fffffff ;//int的最大值:
	int min = -max - 1 ; //int的最小值:-2147483648
	//防止逆转之后溢出,定义long long 类型
	long long res = 0 ;
	//整体逆转
	while(n != 0)
	{
		res = res * 10 + n % 10 ;
		n /= 10 ;
	}
	//判断是否溢出
	if(res > max || res < min)
	{
		return 0 ;
	}
	else 
		return res ;
}

int main()
{
	int n = 0 ;
	int count = 0 ;
	printf("----------此程序来逆转某个整数----------\n") ;
	while(count <= 2)
	{
	printf("\n请输入你想要逆转的数字: ") ;
	scanf("%d", &n) ;
	printf("逆转之后结果为: %d\n", reverse_int(n)) ;
	count ++ ;
	}
	return 0 ;
}

运行结果:
No.26 我与代码的日常:逆转整数,回文字符串,回文数字,查询数组中遗漏数字,判断2的幂

//判断一个字符串是否为回文字符串:abcdcba
#include <stdio.h>
#include <string.h>

int is_pal(char* str)
{
	char* start = str ;
	char* end = str + strlen(str) - 1 ;
	while(start < end)
	{
		if(*start != *end)
		{
			return 0 ;
		}
		else
		{
			start++ ;
			end-- ;
		}
	}
	return 1 ;
}

int main()
{
	char str[1024] = {"0"} ;
	int count = 0 ;
	printf("----------此程序来判断是否为回文字符串----------\n") ;
	while(count <= 1)
	{
		printf("\n请输入你想要判断的字符串: ") ;
		scanf("%s", str) ;
		if(1 == is_pal(str))
		{
			printf("Yes!\n") ;
		}
		else
			printf("No!\n") ;
		count++ ;
	}
	return 0 ;
}

运行结果:
No.26 我与代码的日常:逆转整数,回文字符串,回文数字,查询数组中遗漏数字,判断2的幂

//判断一个数是否为回文数(负数不是回文数,考虑溢出情况)
#include <stdio.h>

int is_pal(int n)
{
	int sum = 0 ;
	int tmp = 0 ;
	//将n赋给tmp,接下来要比较tmp与sum是否相等
	tmp = n ;
	//处理负数
	if(n < 0)
	{
		return 0 ;
	}
	while(n != 0)
	{
		sum = sum * 10 + n % 10 ;
		n /= 10 ;
	}
	//考虑溢出
	if(sum <= 0x7fffffff)
	{
		if(tmp == sum)
			return 1 ;
		else 
			return 0 ;
	}
	return 0 ;
}

int main()
{
	int n = 0 ;
	int count = 0 ;
	printf("----------此程序来判断某数是否为回文数----------\n") ;
	while(count <= 2)
	{
		printf("\n请输入一个数字:") ;
		scanf("%d", &n) ;
		if(1 == is_pal(n))
		{
			printf("Yes!\n") ;
		}
		else
			printf("No!\n") ;
		count++ ;
	}
	printf("\n") ;
	return 0 ;
}

运行结果:
No.26 我与代码的日常:逆转整数,回文字符串,回文数字,查询数组中遗漏数字,判断2的幂

//从到n之间取出n个数,找出漏掉的数(不使用额外数组)
//算法分析:可以将~n先存入一个数组,然后与给定的数组进行
//连续异或,可以把问题转化为在这些数字中查找单独出现的值
#include <stdio.h>

int find_num(int a[], int sz)
{
	int i = 0 ;
	int ret = 0 ;
	//先将~n连续异或
	for(i=0; i<=sz; i++)
	{
		ret ^= i ;
	}
	//再将~n的连续异或值拿出与给定数组进行异或
	for(i=0; i<sz; i++)
	{
		ret ^= a[i] ;
	}
	return ret ;
}

int main()
{
	int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 9} ;
	int size = sizeof(a) / sizeof(a[0]) ;
	int i = 0 ;
	printf("----------此程序为了查询漏掉的数字----------\n") ;
	printf("原数组为: ") ;
	for(i=0; i<size; i++)
	{
		printf("%d ", a[i]) ;
	}
	printf("\n遗漏的数字为: %d\n", find_num(a, size)) ;
	printf("\n") ;
}

运行结果:
No.26 我与代码的日常:逆转整数,回文字符串,回文数字,查询数组中遗漏数字,判断2的幂

//判断一个数是否为的幂
//算法分析:可以转换成找二进制中只出现一次的数
// 0001 ---> 1  2^0
// 0010 ---> 2  2^1
// 0100 ---> 4  2^2
         
#include <stdio.h>

int power(int n)
{
	int count = 0 ;//计算出现的次数
	int i = 0 ;
	for(i=0; i<32; i++)
	{
		if(1 == ((n>>i) & 1))
		{
			count++ ;
		}
	}
	return count == 1 ; 
}

int main()
{
	int n = 0 ;
	int count = 0 ;
	printf("----------此程序来判断某数是否为的幂----------\n") ;
	while(count <= 2)
	{
	printf("\n请输入你想要判断的数: ") ;
	scanf("%d", &n) ;
	if(1 == power(n))
	{
		printf("Yes!\n") ;
	}
	else 
	{
		printf("No!\n") ;
	}
	count++ ;
	}
	return 0 ;
}

运行结果:
No.26 我与代码的日常:逆转整数,回文字符串,回文数字,查询数组中遗漏数字,判断2的幂

学习不易,需要坚持。