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