注解: default是在case匹配失败的时候才会执行
(一)最大公约数(gcd:Greatest Common Divisor)和最小公倍数(lcm:Least Common Multiple)
1.什么是最小公倍数以及什么是最大公约数?
最小公倍数(Least Common Multiple):两个或多个整数公有的倍数(就是这个两个及以上整数 乘以0以外的整数 产生相同的结果中最小的数值 就是他们的最小公倍数 )
最大公约数(Greatest Common Divisor): 同样是适用于两者或两者以上的除数(就是两个及以上的整数 除以0以外的整数 且可被整除的数 这些整数中最大的那一个 就是他们的最大公约数)
2.如何区分最大公约数和最小公倍数(口诀20字)
最大公约数是除出来的 最小公倍数是乘出来的
3.详解二者求法及(C语言)代码实现
最大公约数(枚举 辗转反侧)
枚举:
int gcd(int x, int y) //用小的值控制循环 { int t = 0; int i = 0; if (x > y) { t = x; x = y; y = t; } for (int i=x; i>=1; i--) { if (y%i==0 && x%i==0) { break; } } return i; }
辗转相除
if (y > x) //大数在前 { t = x; x = y; y = t; } while (y != 0) { k = x%y;; x = y; y = k; }
最小公倍数
公式法:
//lcm(a,b) = (a/gcd(a,b)) * b;
二.素数判断
素数也叫质数(prime number) 两个条件 1.大于1的自然数 2.只能被 1 和 它本身整除
1.依次遍历类型
#include <stdio.h> //依次遍历类型 int main(void) { int n = 0; int flag = 0; scanf("%d", &n); for (int i=1; i<=n; i++) { flag = 0; for (int j=1; j<=i; j++) { if (i%j == 0) { flag++; } } if (flag == 2) { printf("%d\n", i); } } return 0; }
2.遍历此数根号
#include <stdio.h> //依次遍历类型 #include <math.h> int main(void) { int n = 0; int flag = 0; scanf("%d", &n); for (int i=1; i<=n; i++) { if (i>1) { flag = 0; for (int j=2; j<=sqrt(i); j++) { if (i%j == 0) { flag++; } } if (flag == 0) { printf("%d\n", i); } } } return 0; }
% 即求模 在C语言中只能用于整型之间
(二).闰年判断
写这个解释是因为小卓同学之前弄不明白闰年到底如何判断?以及为什么是这样?
我的理解:
我们通常说的闰年其实是由两部分组成的(根据1582年以来的置闰规则)
一: 普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年
二:世纪闰年:公历年份是整百数(即100的倍数),且必须是400的倍数才是闰年;
所以才有了我们的 ((year%4==0&&year%100!=0) || (year%100==0&&year%400==0))
对于浮点数精度误差导致 100个0.1累加就不是准确的10了. 这也是为什么浮点数比较是否相等时,不能使用==而是要检查差距是否小于可以接受的误差之内
像这样无论怎么样都达不到循环终止条件的循环,我们称其为死循环
int 取值范围的大小中 十进制应该为2147483647。
strlen和sizeof的区别是什么?
1.strlen是一个函数,需要头文件 sizeof是一个运算符不需要头文件
2.strlen 不计算空字符 '/0' sizeof会计算将空字符'/0'
全局变量为什么不提倡使用? (引用自大佬的文章)
代码量少, 功能也少,那全局变量无疑是最适合的同步方式。但是对于代码量大,功能有 多,逻辑又复杂的系统来讲,“稳定”来源于方方面面,其中就需要严谨和方便维护,所以不适用全局变量能够大大的避免出bug, 方便后期维护,这个时候就需要考虑下,尽量少用全局变量