1.volatile类型修饰符,可以让变量被不同的线程访问和修改,也可以防止变量被编译器优化,而const用来限定一个变量不允许被改变,但下面的程序运行结果为20。
#include<stdio.h>
int main()
{
volatile const int num = 10;
int *p = (int *) & num;
*p = 20;
printf("%d\n",num);
return 0;
}2.返回一个数的二进制表达中1的个数。
#include<stdio.h>
int main()
{
unsigned int i;
scanf("%d",&i);
printf("%d的二进制表达中有 %d 个1",i,count_one_bits(i));
return 0;
}
int count_one_bits(unsigned int m)
{
int n,count; // 返回 1的位数
n = m;
count = 0;
while(n % 2 == 0)
n = n / 2;
while(n % 2 == 1)
{
count++;
do
{
if (n != 0)
n = n / 2;
else
break;
}
while(n % 2 == 0);
}
return count;
}这是我自己写的,最容易想到的办法就是不断地除2模2取余,下面是老师给的方法(省略部分语句)
...
i = 32;
while(i--)
{
if(num & 1 == 1)
count++;
num = num>>1;
}这种方法就是向右移位,使最低位&上1进行判断,还有一种方法
int count_one_bit(int num)
{
int count = 0;
while(num)
{
count++; //只要一个数不为0,则二进制表达中至少有一个1
num = num & (num-1);//没执行一次这条语句,其实就是使该数最低位的一个1置成0
}
return count;
}3.求两个数的最大公约数。
#include<stdio.h>
int main()
{
int a,b,i;
int min,max;
int p = 0;
scanf("%d%d",&a,&b);
if(a > b) //再上了两节课后,才发现这个if else什么的完全可以用提条件运算符来代替的
{ 嘛~~~就是 a>b?a:b;
min = b;
max = a;
}
else
{
min = a;
max = b;
}
for(i = min;i > 1;i--)
{
if(min % i ==0) //我所能第一想到的办法,就是从最小的数开始不断的往下除/(ㄒoㄒ)/
{
if(max % i == 0)
{
p = i;
printf("最大公约数为:%d\n",p);
break;
}
}
}
if(p == 0)
printf("没有最大公约数\n");
return 0;
}来来来,给你看看老师的代码
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
while (a%b)
{
int tmp = a%b;
a = b;
b = tmp;
}
printf("%d\n", b);
system("pause");
return 0;
}他告诉我们,求两个数的最大公约数,就是用辗转相除法,不断地相除取余,最终得到可以除尽的余数就是最大公约数,而最小公倍数就是两个数的乘积除以最大公约数......
本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1698197
原文:http://2627lounuo.blog.51cto.com/10696599/1698197