首页 > 代码库 > 1412192154-hpu-数字整除

1412192154-hpu-数字整除

1165: 数字整除

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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;
}



1412192154-hpu-数字整除