No.26 我與程式碼的日常:逆轉整數,迴文字串,迴文數字,查詢陣列中遺漏數字,判斷2的冪
阿新 • • 發佈:2018-11-17
學習不易,需要堅持。
-
逆轉整數: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 ;
}
執行結果: