1. 程式人生 > >No.26 我與程式碼的日常:逆轉整數,迴文字串,迴文數字,查詢陣列中遺漏數字,判斷2的冪

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的冪

//逆轉一個整數,考慮溢位情況
#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 ;
}

執行結果:
在這裡插入圖片描述

學習不易,需要堅持。