目录
统计二进制中1的个数
#include <stdio.h>
#include <stdlib.h>
int count_bit_one(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
count++;
n = n / 2;
}
return count;
}
int main()
{
int a = 0; scanf("%d", &a);
int count = count_bit_one(a);
printf("count = %d\n", count);
system("pause");
return 0;
}
或者不限定为无符号数
int count_bit_one(int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
count++;
}
return count;
}
但是两种算法都不太好。
int count_bit_one(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
n & (n - 1)假如n为13,13的二进制数为1101
1101 n
1100 n-1
1100 n新
1011 n-1
1000 n新新
011 n - 1
0000 n新新新
每按位与一次,就会去掉最右面的1。
与之前的方法不同,无论怎样都要循环32遍,而这个方法有多少个1循环多少遍。
system("pause")的意思是暂停正在执行的程序,等待用户按下任意键后继续执行。
求二进制中不同位的个数
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
输出二进制的奇数位和偶数位
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
void Print(int m)
{
int i = 0;
printf("奇数位: \n");
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
printf("偶数位: \n");
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
}
int main()
{
int m = 0;
scanf("%d", &m);
Print(m);
return 0;
}
使用指针打印数组内容
void Print(int* p, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sz = sizeof(arr) / sizeof(arr[0]);
Print(arr, sz);
return 0;
}
递归存在限制条件,每次递归被调用后越来越接近这个限制条件,满足限制条件后,递归停止。递归层次太深会出现栈溢出现象。
乘法口诀表
实现一个函数,打印乘法口诀表,行数和列数自己指定,如:输入9,输出9*9口诀表,输入12,输出12*12口诀表
void print_table(int n)
{
int i = 0;
for (i = 1; i <= n; i++)
{
int j = 0;
for (j = 1; j <= i; j++)
{
printf("%d * %d = %-4d", i, j, i * j);
}
printf("\n");
}
}
int main()
{
int n = 0;
scanf("%d", &n);
print_table(n);
return 0;
}
字符串逆序
编写一个函数reverse_string(char * string)
实现:将参数字符串中的字符反向排列
要求:不能使用c函数库中的字符串操作函数
#include <string.h>
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
void reverse_string(char arr[])
{
int left = 0;
int right = my_strlen(arr) - 1;
while (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
这是循环方法来使用my_strlen。下面是递归方法
void reverse_string(char* arr)
{
char tmp = arr[0];
int len = my_strlen(arr);
arr[0] = arr[len - 1];
arr[len - 1] = '\0';
if (my_strlen(arr + 1) >= 2)
reverse_string(arr + 1);
arr[len - 1] = tmp;
}
一个数的每位之和(递归实现)
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和。
例如。调用这个函数,则应该返回1 + 7 + 2+ 9,它的和是19
输入1729,输出19
#include <string.h>
int DigitSum(unsigned int num)
{
if (num > 9)
return DigitSum(num / 10) + num % 10;
else
return num;
}
int main()
{
unsigned int num = 0;
scanf("%d", &num);
int ret = DigitSum(num);
printf("ret = %d\n", ret);
return 0;
}
递归实现n的k次方
int Pow(int n, int k)
{
if (k < 0)
return (1.0 / (Pow(n, -k)));
else if (k == 0)
return 1;
else
return n * Pow(n, k - 1);
}
int main()
{
int n = 0;
int k = 0;
int ret = Pow(n, k);
printf("ret = %d\n", ret);
return 0;
}
结束。