MT2007-快速判断一个数能否被整除
时间:2022-09-20 08:30:00
快速判断一个整数能否被另一个整数整除
[info]
也许每个人时候大家可能都知道一些快速判断一个数可以被特殊数整除的方法,比如:
若一个数的所有数字之和都能被3整除,则该数可被3整除;
若一个数的位置为0或5,则该数可以被5排除;
如果一个数的个位数加10位数的2倍加上百位数的4倍可以被8整除,那么这个数可以被8整除
若一个数的所有数字之和都能被9整除,则该数可被9整除;
若一个数所有奇数位数加减去所有偶数位数后的值能被11整除,则该数能被11整除;
但是如何快速判断一个数字可以被7整除呢?本文对被整除的理论进行了深入分析。
设x和m是自然数: x=xn …. x3 x2 x1 xx的位置, x十位二为x, x三是x的百位, xn为x的N位 如x=2368,则x1=8,x2=6,x3=3,x4=2 公式如下: x%m=( x1 101%m*x2 102%m*x3 …… 10n-1%m*xn)%m 其中%表示求余数的符号 公式证明 根据余数的两个定理 (m n)%k=(m%k n%k)%k(结合率) (m*n)%k=((m%k)*n)%k (交换率) 则 x%m = (x1 x2*10 x3*102 xn*10n-1)%m = (x1%m x2*10%m x3*102%m xn*10n-1%m)%m = (x1%m (10%m*x2)%m (102%m*x3)%m (10n-1%m*xn)%m)%m = (x1 10%m*x2 102%m*x3 10n-1%m*xn)%m 所以公式得证 举例: 如果一个数的所有数字之和能被3整除,则这个数能被3整除 10%3=1,100%3=1,1000%3=1.....10n%3=1 x%3=(x1 x2 x3 ...... xn)%3 如果一个数的个位数能被5整除,则这个数能被5整除,也就是说个位为0或5的数都能被 5整除 10%5=0,100%5=0,1000%5=0.....10n%5=0 x%5=x1%5 7这个数字比较麻烦,用语言直接描述不好,大家看公式就知道了。 10 %7=3,102%7=2,103%7=6,104%7=4,105%7=5,106%7=1, 107%7=3,108%72..... x%7=(x1 + 3x2+ 2x3+ 6x4+ 4x5+ 5x6+ x7+......)%7 也可写为 x%7= (x1 + 3x2+ 2x3 - x4 - 3x5 - 2x6+ x7+......)%7 例: 567%7=(7+3*6+2*5)%7=(7+18+10)%7=35%7=0 所以567%7=0
题目位置
[码题集](码蹄集 (matiji.net))
思想迸发
首先就是判断每一个数的 各个位数之和 % 3 == 0 话 cnt++
否则将 !=0 放入数组index
将index[i] + index[i+1] %3 ?= 0 √ cnt++ 同时将index[i] = index[i+1] = -1
最后cnt /= 2 因为两个数字为一组啊啊啊
AC code
#include
using namespace std;
typedef long long ll;
#define quicken ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define MAX_NUM 10005
#define MOD 100000007
#define PI 3.1415926
double res;
ll ans, n, m, t, k,len, cnt = 0, minn = MAX_NUM,maxx = 0;
char ch, s1[MAX_NUM] = "", s2[MAX_NUM] = "";
bool flag = false;
ll get_sum(ll t) {
ll temp = 0;
while (t) {
temp += t % 10;
t /= 10;
}
return temp;
}
int main() {
quicken;
ll index_num = 0;
cin >> n;
vector index;
for(int i = 1; i <= n; i++) {
cin >> index_num;
if(get_sum(index_num) % 3 == 0) {
cnt++;
} else {
// push_back就是将值放入vector的最后一位,其实是每次放入都进行一次malloc重新分配内存
index.push_back(get_sum(index_num));
}
}
for(int i = 0; i < index.size(); i++) {
if(index[i] == -1) continue;
for(int j = i+1; j < index.size(); j++) {
if(index[j] == -1) continue;
if((index[i] + index[j]) % 3 == 0) {
cnt += 2;
index[i] = -1;
index[j] = -1;
break;
}
}
}
cnt /= 2;
cout << cnt << endl;
return 0;
}
//3
//123 123 99
下面是一些无聊的东西哈哈哈!!!.
浅红色文字:浅红色文字:
深红色文字:深红色文字
浅绿色文字:浅绿色文字
深绿色文字:深绿色文字
浅蓝色文字:浅蓝色文字
深蓝色文字:深蓝色文字
浅黄色文字:浅黄色文字
深黄色文字:深黄色文字
浅青色文字:浅青色文字
深青色文字:深青色文字
浅紫色文字:浅紫色文字
深紫色文字:深紫色文字