目录
1.?统计二进制数中1的个数
2. 比较两个二进制数中,不同位的个数
3.?交换两个变量,不创建临时变量
4. 递归实现字符串逆序
5.?递归计算一个非负整数的数字之和;例如:123 输出6
6.?递归实现n的k次方(正数)
1.?统计二进制数中1的个数
int Count_bit1(int a)//统计二进制位中1的个数
{
int count = 0;
//类比十进制中,获得每一位,123,123%10=3,123/10=12,12%10=2
while(a != 0)
{
if(a % 2 == 1)
count++;
a = a/2;
}
return count;
}
int Count_bit2(int a)//统计二进制位中1的个数
{
int count = 0;
int i = 0;
for(i = 0; i<32; i++)
{
//a = a >> i;
if(((a>>i) & 1) == 1)//移位操作本身不会改变变量的值
count++;
}
return count;
}
int Count_bit3(int a)//统计二进制位中1的个数
{
int count = 0;
while(a)
{
a = a & (a-1);//a & (a-1) 每一次相邻两位数按位与都会减少一个二进制的1
count++;
}
return count;
}
int main(){
int a = -1;
int count1 = Count_bit1(a);//该函数对负数不适用
int count2 = Count_bit2(a);//通过位操作符来计算
int count3 = Count_bit3(a);//最精简的一种写法
printf("%d\n", count1);
printf("%d\n", count2);
printf("%d\n", count3);
}
2. 比较两个二进制数中,不同位的个数
int Compare_bit1(int a, int b)
{
int count = 0;
int i = 0;
for(i=0; i<32; i++)
{
if(((a>>i)&1) != ((b>>i)&1))
count++;
}
return count;
}
int Compare_bit2(int a, int b)
{
int tmp = a^b;//直接用异或,相同位为0,不同位为1;
return Count_bit1(tmp);//然后用函数统计tmp中有多少个1;
}
int main(){
int a = 0;
int b = 7;
int ans1 = Compare_bit1(a, b);//每一位分别比较
int ans2 = Compare_bit2(a, b);//用异或来统计:相同位为0,不同位为1;
printf("%d\n",ans1);
printf("%d\n",ans2);
}
3.?交换两个变量,不创建临时变量
int a = 5; int b = 3;
a = a+b; b = a-b; a = a-b;
printf("%d %d",a,b);
int a =5; int b = 3;
a = a^b;//用异或的方法;
b = a^b;
a = a^b;
printf("%d %d",a,b);
4. 递归实现字符串逆序
void Reverse_string2(char arr[])
{
char tmp = arr[0];
int sz = strlen(arr);
arr[0] = arr[sz-1];
arr[sz-1] = '\0';
if(strlen(arr+1) >= 2)
{
Reverse_string2(arr+1);
}
arr[sz-1] = tmp;
}
int main(){
char arr[] = "abcdef";
int sz = strlen(arr);
Reverse_string2(arr);//递归的方法
printf("%s\n",arr);}
5.?递归计算一个非负整数的数字之和;例如:123 输出6
int Count_sum1(int a)
{
int sum = 0;
while(a != 0)
{
sum += a%10;
a /= 10;
}
return sum;
}
int Count_sum2(int a)
{
if (a < 10)
return a;
else
return Count_sum2(a/10) + a%10;
}
int main(){
int a = 123;
//int sum = Count_sum1(a);//循环的方法
int sum = Count_sum2(a);//递归的方法
printf("%d\n",sum);
}
6.?递归实现n的k次方(正数)
int Pow(int n, int k)
{
if(k>=1)
return Pow(n,k-1) * n;
else
return 1;
}
int main(){
int n = 5;
int k = 2;
int ret = Pow(n,k);
printf("%d\n", ret); }
|