知识点补充

倍数问题

第1章 c++程序设计入门 - 图1

题解不严谨:

第1章 c++程序设计入门 - 图2

10-40之间有多少个数是3的倍数

10-40之间有多少个数是3的倍数
  • 大于10 是3的位数为 10/3 +1 , 如果正好能被 整除 不用加1 如 9/3
  • 小于40 是3的倍数为 40/3

  • 两者之间为: (40/3) - (10/3 +1) + 1 = 40 /3 - 10 /3

即 求[m,n]之间是x的位数公式: m/x - n/n

通过数学公式来计算区间 [m,n] 中 x 的倍数个数。

设 k 表示区间 [m,n] 中 x 的倍数的个数,则有:

k = ⌊n/x⌋ - ⌈m/x⌉ + 1

其中 ⌊n/x⌋ 表示向下取整,即不大于 n/x 的最大整数;⌈m/x⌉ 表示向上取整,即不小于 m/x 的最小整数。

该公式的含义是,首先计算区间 [m,n] 中不大于 n 的最大的 x 的倍数,即 ⌊n/x⌋;然后计算区间 [m,n] 中不小于 m 的最小的 x 的倍数,即 ⌈m/x⌉;最后将这两个值相减,并加 1 即可得到区间 [m,n] 中 x 的倍数的个数 k。

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. int main()
  5. {
  6. int m, n, x;
  7. cout << "请输入区间[m, n]的m值:";
  8. cin >> m;
  9. cout << "请输入区间[m, n]的n值:";
  10. cin >> n;
  11. cout << "请输入要计算的倍数x的值:";
  12. cin >> x;
  13. int k = floor(n / x) - ceil(m / x) + 1;
  14. cout << "区间[" << m << ", " << n << "]中" << x << "的倍数个数为:" << k << endl;
  15. return 0;
  16. }

⌈m/x⌉ 向上取整,如果 m能被 x 整除,值为 m /x 如果不能整除有余数 值为 m/x +1

故代码可写为:

  1. int k = n / x - m/x;
  2. if(m % x ==0) k++;
  3. cout << "区间[" << m << ", " << n << "]中" << x << "的倍数个数为:" << k << endl;

疯狗问题(病狗问题)

第1章 c++程序设计入门 - 图3

疯狗问题.mp4