题目描述
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
输入格式
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10^100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。
输出格式
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。
样例输入
复制
34 201 2098765413 1717171717171717171717171717171717171717171717171718 0
样例输出
复制
1 0 1 0
对于这道题,数据的最大范围是pow(10,100),显然不能使用类型来直接处理数字,在这种情况下,要存放下这么长的数字,并且还要对其进行指定位的操作,就想到了将它放在字符数组里。
#include<stdio.h>
#include<string.h>
int IsMul(char* ch, int len) {
int n = 0;
int digit = 0;
if (len == 2) {//两位数直接转化成整型判断是否能整除17
n = 10 * (ch[0] - 48) + (ch[1] - 48);
if (n % 17 == 0)
return 1;
else
return 0;
}
else if (len == 3) {//三位数使用题干给出的方法
digit = ch[2] - 48;//得到个位数
n = 10 * (ch[0] - 48) + (ch[1] - 48);//去掉个位数剩下的数字
n = n - 5 * digit;//余下的数减去个位数的五倍
if (n % 17 == 0)//判断
return 1;
else
return 0;
}
else {//四位数及以上
digit = ch[len - 1];//得到个位数
//由于个位数的五倍最大为45,而余下数的后两位可能不够减,所以直接取出最后三位数
n = (ch[len - 4] - 48) * 100 + (ch[len - 3] - 48) * 10 + (ch[len - 2] - 48);
n = n - 5 * digit;//用余下数的最后三位减去个位数的5倍
ch[len - 1] = '\0';//将最后一位置为0
//将相减之后的数重新输入字符数组
ch[len - 2] = n % 10 + 48;
n /= 10;
ch[len - 3] = n % 10 + 48;
n /= 10;
ch[len - 4] = n + 48;
IsMul(ch, strlen(ch));//判断相减之后的数是否是17的倍数
}
}
int main()
{
char ch[102] = { 0 };//由于题目所给的数字范围最大是pow(10,1000)
//对于这么大的数字,任何类型都是无法处理的,但题目中给出了判断
//是否是倍数的方法,这种按位处理的方式再加上超长的数字就给了用
//字符串来读取数字的灵感
while (scanf("%s", ch)) {//读取一个数字
if (ch[0] == '0')//读到0就停止
break;
if (ch[1] == '\0')//一位数直接排除
continue;
if (IsMul(ch, strlen(ch)))//两位数以上进入函数判断
printf("1\n");
else
printf("0\n");
}
return 0;
}