1003: 数字整除
时间限制: 1 Sec 内存限制: 128 MB提交: 10 解决: 7
题目描述
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。
样例输入
34
201
2098765413
1717171717171717171717171717171717171717171717171718
0
样例输出
1
0
1
0
提示
来源
思路:
大数模拟的练习题,因为有很大很大的数所以只能用大数高精度。觉得题意的定理实现起来有点麻烦..所以直接用的大数。我们在进行除法运算的时候,就是从最高位开始,如果不能整数则这位商0,然后这位*10+下一位,再进行除法。如果可以除掉,那么商数余一个余数,然后再不能除就*10,这个题就是模拟的这个过程。
当然如果按照题意也能做,去网上搜了一下用题目定理写的AC代码,也贴到后边了。
代码:
//大数模拟
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
char s[110];
while(scanf("%s",s)!=EOF&&strcmp(s,"0")!=0)
{
int len=strlen(s);
int re=0;
for(int i=0;i<len;i++)
{
if(re<17)
{
re=re*10+s[i]-'0';
}
else
{
re=re%17*10+s[i]-'0';
}
}
if(re%17==0)printf("1\n");
else printf("0\n");
}
}
//题意做法
#include<stdio.h>
#include<string.h>
int main()
{
int i,x,m ;
char s[1001] ;
while(scanf("%s",s)!=EOF && strcmp(s,"0"))
{
int h=strlen(s) ;
x=(s[h-1]-'0')*5 ;
h-- ;
m=0 ;
for(i=0;i<h;i++)
{
m=s[i]-'0'+m ;
if(m<17)
{
m=m*10 ;
}
else m=(m%17)*10 ;
}
if(m/10==x%17)
printf("1\n") ;
else printf("0\n") ;
}
return 0 ;
}