学习不易,需要坚持。
-
逆转整数:Reverse Integer
Example1: x = 123, return 321
Example2: x = -123, return -321
处理溢出: 比如整数最大值2147483647逆转之后的整数值不存在
要求所有值逆转之后再判断是否溢出 -
判断一个字符串是否为回文字符串:abcdcba
要求:不能使用额外数组,额外字符串 -
判断一个数字是否为回文数(负数不是回文数)
要求:不能使用额外数组,不允许计算中出现溢出 -
从0到n之间取出n个数,找出漏掉的那个数,这n个数乱序
要求:不使用额外数组 -
给出一个整数,判断它是否是2的幂
//逆转一个整数,考虑溢出情况
#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 <= 1)
{
printf("\n请输入你想要逆转的数字: ") ;
scanf("%d", &n) ;
printf("逆转之后结果为: %d\n", reverse_int(n)) ;
count ++ ;
}
return 0 ;
}
运行结果:
//判断一个字符串是否为回文字符串: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 ;
}
运行结果:
//判断一个数是否为回文数(负数不是回文数,考虑溢出情况)
#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 ;
}
运行结果:
//从到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") ;
}
运行结果:
//判断一个数是否为的幂
//算法分析:可以转换成找二进制中只出现一次的数
// 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 ;
}
运行结果: