二進位制與遞迴
阿新 • • 發佈:2018-11-09
**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;
}