1. 程式人生 > >二進位制與遞迴

二進位制與遞迴

**1.寫一個函式返回引數二進位制中 1 的個數 **
二進位制的運算方式正巧滿足了遞迴的結果,利用除二計算餘數,同時在將最後得到的餘數按照相反的方向輸出,利用全域性變數在整個過程中記錄所需值,有需要時還可以用全域性陣列儲存二進位制數;

//寫一個函式返回引數二進位制中 1 的個數
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int count = 0;//全域性變數檢視1的值
int count_one_bits(unsigned int value) {
	//1.利用取餘轉換為二進位制
	int temp = 0;
	if (value  != 0){
		temp = value % 2;
		count_one_bits(value / 2);
	}
	printf(" %d ", temp);
	if (temp == 1){
		count++;
	}
	return count;
}
int main(){
	//給出想要查詢的數
	unsigned int num;
	scanf("%d", &num);
	int nums = count_one_bits(num);
	printf("\n%d的二進位制中一的個數為:%d\n", num, nums);
	system("pause");
	return 0;
}  

**2.獲取一個數二進位制序列中所有的偶數位和奇數位,
分別輸出二進位制序列。 **
利用相同的套路分別得到二進位制的每一位,同時增添一個引數用於判斷當前需要輸出的是奇數位還是偶數位;

//獲取一個數二進位制序列中所有的偶數位和奇數位, 分別輸出二進位制序列。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int count = 0;
void ChangeTow(unsigned int num,int flag){
	int temp = 0;
	if (num  != 0){
		temp = num % 2;//0 1 0
		ChangeTow(num / 2,flag);
		
	}
	count++;
	if (flag == 0){
		if (count % 2 == 0){
			printf("%d ", temp);//0
		}
	}
	if (flag != 0){
		if (count % 2 != 0){
			printf("%d ", temp);
		}
	}
}
int main(){
	//獲取一個數
	unsigned int num;
	scanf("%d", &num);
	//化為二進位制
	printf("偶數項為:\n");
	ChangeTow(num,0);
	count = 0;
	printf("\n奇數項為:\n");
	ChangeTow(num, 1);
	printf("\n");
	system("pause");
	return 0;
}

3.輸出一個整數的每一位。

//輸出整數的每一位
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void Prtnum(int n){
	if (n > 9){
		Prtnum(n/10);
	}
	printf("%d\n", n % 10);
}
int main(){
	//輸入一位數
	printf("請輸入一個整數:\n");
	int num;
	scanf("%d",&num);
	Prtnum(num);
	system("pause");
	return 0;
}

**4.兩個int(32位)整數m和n的二進位制表達中,有多少個位(bit)不同? **
在函式中同時輸入這兩個數,僅當位數多的一個數到達尾部時在停止遞迴,位數小的數將用零補位,當同位上餘數值不同時讓全域性變數加一;

//兩個整數的二進位制數有多少位不同
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int count = 0;
int ChengeNum(int n1, int n2){
	if (n1 > 0 || n2 > 0){
		ChengeNum(n1 / 2, n2 / 2);
	}
	if (n1 % 2 != n2 % 2){
		count++;
	}
	return count;
}
int main(){
	printf("請輸入兩個數:\n");
	int num1;
	int num2;
	scanf("%d %d", &num1, &num2);
	int result = ChengeNum(num1, num2);
	printf("%d和%d的二進位制相差%d位\n",num1,num2,result);
	system("pause");
	return 0;
}