您的位置:首页 > 其它

NBUT1461 数字整除(大数处理,减法、除法)

2016-04-30 18:02 501 查看
数字整除

Description

定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。

例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。

Input
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10^100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。

Output
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: