10.求最大公约数 Common divisor
方法1:暴力求解
最大公约数:可能是二者中的最小值,
所以用两数中的最小值不断减1 试除
//法一 int main() { int m = 0; int n = 0; int min = 0; scanf("%d %d", &m, &n); min = m < n ? m : n; //求两数中的最小值 while (min) { if (m % min == 0 && n % min == 0) { printf("%d和%d的最大公约数为:%d\n",m, n, min); break; } min--; } return 0; } 复制代码
方法2:辗转相除法
int main() { int m = 0; int n = 0; scanf("%d %d", &m,&n); int r = 0; //辗转相除法 while (r = m %n) { m = n; //将n的值赋给m n = r; //将余数赋给n } printf("%d\n", n); return 0; } 复制代码
11.求最小公倍数 Common multiple
法1:暴力求解
最小公倍数:可能是二者中的最大者
只需要+1往下试即可
int main() { int n = 0; int m = 0; scanf("%d %d", &n, &m); int max = n > m ? n : m; //二数中的最大者 while (1) { if (max % n == 0 && max % m == 0) { printf("%d %d的最小公倍数为:%d\n", n, m, max); break; } max++; } return 0; } 复制代码
方法2:最小公倍数 = 两数之积/最大公约数
//求最大公约数 int MaxCommonDivisor(int m,int n) { int r = 0; //辗转相除法 while (r = m % n) { m = n; //将n的值赋给m n = r; //将余数赋给n } return n; } int main() { int m = 0; int n = 0; scanf("%d %d", &m, &n); int ret = MaxCommonDivisor(m, n); printf("%d %d 的最小公倍数为:%d,最大公约数为:%d\n", m, n, m * n / ret,ret); return 0; } 复制代码
12.程序题:判断1000-2000年中的闰年
闰年: 1.能被4整除,不能被100整除 && 2.能被400整除 || 复制代码
int main() { int year = 0; int count = 0; //计数 for (year = 1000; year <= 2000; year++) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { count++; printf("%d ", year); } } printf(" \n1000年到2000年中,闰年个数为:%d\n",count); return 0; } //count:243 复制代码
//也可以写成 int main() { int count = 0; int year = 0; for(year = 1000; year <=2000;year++) { if (year % 4 == 0 && year % 100 != 0) { count++; printf("%d ", year); } else if (year % 400 == 0) { count++; printf("%d ",year); } } printf(" \n1000年到2000年中,闰年个数为:%d\n", count); return 0; } //count :243 复制代码
错误写法
//错误写法 int main() { int count = 0; int year = 0; for(year = 1000; year <=2000;year++) { if (year % 4 == 0 ) { if(year % 100 != 0) { count++; printf("%d ", year); } } else if (year % 400 == 0) { count++; printf("%d ",year); } } printf(" \n1000年到2000年中,闰年个数为:%d\n", count); return 0; } //count :240 //少了三个年份:1200 1600 2000 //原因:进入了if 就不进入 else if 满足y%4==0 就进入if ,但是后面的else if就不进入了,所以造成了缺少三个年份 复制代码
13.程序题:打印100-200之内的素数
法1:试除法
素数:除了1和本身之外,不能被其他数整除
判断i是否为素数:拿2到i-1的数字试除i
//写法1: //是素数返回1,不是素数返回0 int is_prime(int n) { int i = 0; for (i = 2; i < n; i++) { if (n %i == 0) { return 0; } } return 1; } //写法2 //用布尔类型 ->引用头文件 stdbool.h bool is_prime(int n) { int i = 0; for (i = 2; i < n; i++) { if (n %i == 0) { return false; } } return true; } int main() { int i = 0; int count = 0; for (i = 100; i <= 200; i++) { if (is_prime(i) == 1) { count++; printf("%d ", i); } } printf("\n100-200之间的素数个数为%d个\n", count); return 0; } //100-200之间的素数个数为21个 复制代码
方法2:开平方
如果 m = a*b a和b至少有一个数字是<= sqrt(m) 例如:16 = 2*8 = 4*4 只要有一个数能把m整除了就不用判断另一个了 所以只要试除到开平方m即可 sqrt() ->开平方函数 引用头文件math.h 复制代码
int main() { int i = 0; int count = 0; for (i = 100; i <= 200; i++) { int flag = 1; //假设为素数 int j = 0; //试除到开平方i for (j = 2; j <=sqrt(i); j++) { if (i % j == 0) { //被整除了,说明不是素数 flag = 0; break; } } if (flag == 1) { printf("%d ", i); count++; } } printf("\n100-200之间的素数个数为%d个\n", count); return 0; } 复制代码
法3:优化
素数只在奇数中产生,所以可以从101开始。每次+=2
int main() { int i = 0; int count = 0; for (i = 101; i <= 200; i+=2) { int flag = 1; //假设为素数 int j = 0; //试除到开平方i for (j = 2; j <=sqrt(i); j++) { if (i % j == 0) { //被整除了,说明不是素数 flag = 0; break; } } if (flag == 1) { printf("%d ", i); count++; } } printf("\n100-200之间的素数个数为%d个\n", count); return 0; } 复制代码
14.程序题:求10个数的最小值和最大值
//错误程序 //原因:取min和max为0,若我们输入时为负数,则最大值会出错 int main() { int arr[10] = { 0 }; int i = 0; // 为数组输入元素 for (i = 0; i < 10; i++) { scanf("%d", &arr[i]); } int max = 0; int min = 0; for (int i = 0; i < 10; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } printf("min=%d max=%d", min, max); return 0; } 复制代码
//正解 //假设数组中的某一个元素为最小值。最大值 int main() { int arr[10] = { 0 }; int i = 0; // 为数组输入元素 for (i = 0; i < 10; i++) { scanf("%d", &arr[i]); } int max = arr[0]; int min = arr[0]; for (int i = 0; i < 10; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } printf("min=%d max=%d", min, max); return 0; } 复制代码