知识点补充
倍数问题
题解不严谨:
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。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int m, n, x;
cout << "请输入区间[m, n]的m值:";
cin >> m;
cout << "请输入区间[m, n]的n值:";
cin >> n;
cout << "请输入要计算的倍数x的值:";
cin >> x;
int k = floor(n / x) - ceil(m / x) + 1;
cout << "区间[" << m << ", " << n << "]中" << x << "的倍数个数为:" << k << endl;
return 0;
}
⌈m/x⌉ 向上取整,如果 m能被 x 整除,值为 m /x 如果不能整除有余数 值为 m/x +1
故代码可写为:
int k = n / x - m/x;
if(m % x ==0) k++;
cout << "区间[" << m << ", " << n << "]中" << x << "的倍数个数为:" << k << endl;
疯狗问题(病狗问题)
疯狗问题.mp4