#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int tmp, i = 0;
while (cin >> str && str != "0")
{
//从头到尾扫一遍
i = 0;
tmp = 0;
while (i < str.size())
{
tmp = (tmp * 10 + (str[i] - '0')) % 17;
i ++;
}
if (tmp % 17 == 0)
cout << 1 << endl;
else
cout << 0 << endl;
}
return 0;
}
相信很多人看到网上都知道这么做,但是这么做的真正原因是什么呢?
数学中有一个判读整除的万能方法----拆成两个数的和(差)
要判断的这个数先拆分成两个数的和或者差,要求较大数必须是这个数的倍数,这样我们只要判断较小的数就可以了。如果较小的这个数也能被这个数整除,我们就说原来这个数也一定能被这个数整除。
936能不能被7整除。
我们要判断936这个数能不能被7整除,可以先把936拆成两个数的和:936=910+26。由于较大数910是7的倍数(能被7整除),因此我们只要判断较小数26能不能被7整除就行了。因为26不是7的倍数,不能被7整除,所以936也一定不能被7整除。
所以我们通过拆分法来解释这个问题
我们随便取一个数289
2%17=0.......2相当于289-17*0=289
28/17=1.......11相当于289-17*10=119
119不能被17整除
34
3%17=0.......3相当于34-17*0=34
34%17=2......0相当于34-17*2=0!
tmp = (tmp * 10 + (str[i] - '0')) % 17;
这个已经体现出上面的那个意思,只是更简单,简单在每一次除以17,这个数n应经被差分成17的倍数和剩余的数了!
希望能帮助到你,我感觉这个真的很重要!