数字整除
Description
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
Input
Output
Sample Input
34201209876541317171717171717171717171717171717171717171717171717180
Sample Output
1010
Hint
无
这道题被题目误导了,上来就根据题目给的方法进行计算了,过后回过头看看这道题,其实,直接就用代码中的除法部分直接计算对 17 取余就行,那些减去什么的都是没用的。
附上代码(根据题意的代码,读者可以自己根据中间的除法部分直接对 17 取余):
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<string> using namespace std; string str; void sovle() { int j = 0; int num1[110]; int sum = str[str.length() - 1] - '0'; for(int i = str.length() - 2;i >= 0;i--) { num1[j++] = str[i] - '0'; } while(num1[0] <= sum * 5) // 减法部分 { int t = 1; while(num1[t] == 0) { num1[t++] = 9; } num1[t] -= 1; num1[0] += 10; } num1[0] -= sum * 5; int sum1 = num1[j - 1]; // 除法部分,对 17 取余部分 j = j - 2; while(j >= 0) { sum1 = sum1 * 10 + num1[j--]; sum1 %= 17; } if(sum1 == 0) cout << 1 << endl; else cout << 0 << endl; } int main() { while(cin >> str) { if(str.length() == 1 && str[0] == '0') break; int ans = 0; for(int i = 0;i < str.length();i++) { ans = ans * 10 + (str[i] - '0'); if(ans > 1000000) { break; } } if(ans <= 1000000) { int num = ans; int sum = num % 10; num /= 10; num -= sum * 5; if(num % 17 == 0) cout << 1 << endl; else cout << 0 << endl; } else sovle(); str.clear(); } return 0; }