定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
标签:
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的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表示否。
#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; }
标签:
原文地址:http://blog.csdn.net/wangluoershixiong/article/details/42032407