二进制位逆置后的数
1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
2550136857
很多同学一看题干,一脸懵逼,它到底想让我干啥??
这里必须对数据底层存储有一定的了解,在32位操作系统下,无符号整型是4个字节,32个比特位,这里需要实现一个函数把某个数的32个比特位逆置。
方法一:
unsigned int reverse_bit(unsigned int value)
{
int i = 31;
int m;
int sum = 0;
while (value != 0)
{
m = value & 1; //取余
value = value >> 1; //除2
sum = sum + m * pow(2, i); //pow(2,1)表示2的i次方
i--;
}
return sum;
}
方法二:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
unsigned int revease_bit(unsigned int val)
{
int i;
unsigned int ret = 0;
//for中两个语句不能互换
for (i = 0; i<32; i++)
{
ret <<= 1;
ret |= ((val >> i) & 1);
/*val右移i位,和“1”进行&运算取出二进制每一位的值,
再和ret或运算,最后移位,使其逆序排列。*/
}
return ret;
}
int main()
{
unsigned int val;
scanf("%u", &val);
printf("%u\n", revease_bit(val));//%u为以无符号十进制输出
system("pause");
return 0;
}
求两个数的平均数
不使用(a+b)/2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
int main()
{
int a=10;
int b=20;
a=a+(b-a)/2;
printf("两个数的平均值是:%d\n",a);
system("pause");
return 0;
}
一元二次方程的解
因为浮点数在内存中的存储方式使得,有些浮点数在内存中无法精确的存储,这样就必然有精度的丢失。一旦丢失就可能计算不够准确。无法使用 == 直接判断两个浮点数相等。
一元二次方程a*x^2+b*x+c=0
- 当
a=0
时,该方程是一元一次方程x=-b/c
。 - 当
a!=0
时候,该方程式一元二次方程
(1)当b^2-4a*c=0
时,只有一个解,x=(-b)/(2*a)
。
(2)当b^2-4a*c>0
时,有两个不相同的解,x1=(-b+sqrt(b^2-4*a*c))
,x2=(-b-sqrt(b^2-4*a*c))
(3)当b^2-4a*c<0
时,该方程无解。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define ZERO 0.00000000001
int main()
{
double a, b, c;
printf("请依次输入一元二次方程的参数>\n");
while (scanf("%lf%lf%lf", &a, &b, &c))
{
if ((a > -ZERO) && (a < ZERO))
printf("%lf\n", -b / c);
else
{
double z = pow(b,2) - 4 * a*c;
if ((z>-ZERO) && (z < ZERO))
printf("%lf\n", (-b) / (2 * a));
else if (z - ZERO>0)
printf("%lf\n%lf\n", (-b + sqrt(z))/2*a, (-b - sqrt(z))/2*a);
else
printf("此题无实数解\n");
}
}
system("pause");
return 0;
}