1165: 数字整除
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 86 Solved: 40
[ Submit][ Status][ Web Board]
Description
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
Input
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n的位数<=10100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。
Output
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。
Sample Input
34 201 2098765413 1717171717171717171717171717171717171717171717171718 0
Sample Output
1 0 1 0
解题思路
用了最笨的方法,即大数加减。首先根据字符串a确立字符串b和字符串c,然后用大数减法b和c求差,然后不断取余17。
代码
#include<stdio.h>
#include<string.h>
char a[11000],b[11000],c[11000],beitai[11000],cha[11000];
//a是给定的字符串,b是去掉个位之后的字符串,c是个位*5之后的字符串,cha是b与c的差得字符串
int main()
{
int now;
int i,j,k,l,m;
int lena,lenb,lenc;
while(scanf("%s",a)&&strcmp(a,"0")!=0)
{
lena=strlen(a);
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(cha,0,sizeof(cha));
//<span style="color:#ff0000;">虽然定义b,c,cha是char型数组,但是用memset(b,0,sizeof(b));将其初始化,其元素都是0,而不是'0';</span>
for(i=lena-2,j=0;i>=0;i--,j++)
b[j]=a[i];
lenb=lena-1;
i=(a[lena-1]-'0')*5;
lenc=0;
while(i)
{
c[lenc]=i%10+'0';
//int型数字转换为char型数字+'0'
i/=10;
lenc++;
}
if(lenc>lenb)
{
strcpy(beitai,b);
strcpy(b,c);
strcpy(c,beitai);
k=lenb;
lenb=lenc;
lenc=k;
}//确保lenb是b和c中字符串最长的
for(i=0;i<=lenb;i++)
{
if(c[i]!=0)//可用if(lenc!=0) + lenc--替换
//存了多少c就用多少
//否则下面int转char不好转
{
j=b[i]-'0';
k=c[i]-'0';
l=j-k;
if(l>=0)
cha[i]=l+'0';
else
{
cha[i]=10+l+'0';
b[i+1]-=1;
}
//lenc--;
}
else
cha[i]=b[i];
}
now=0;
for(i=lenb-1;i>=0;i--)
{
now=now*10+cha[i]-'0';
now%=17;//不断取余,即同余定理展开
}
if(now==0)
printf("%d\n",1);
else
printf("%d\n",0);
}
return 0;
}