描述
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的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
大数题。按照题目里给的定理走就行了。
#include <stdio.h> #include <string.h> charcnum[1005]; intnum[1005]; intmain() { intexdiv(intlt); inti; intl; while(scanf("%s",cnum)&&strcmp(cnum,"0")) { memset(num,0,sizeof(int)*1005); for(i=strlen(cnum)-1;i>=0;i--) num[i]=cnum[i]-'0'; l=strlen(cnum); printf("%d\n",exdiv(l-1)); } return0; } intexdiv(intlt) // ,判断num的前lt位能不能被17整除 { voidhsub(intl,intsubt); inti; intunit; // 个位 unit=num[lt]*5; //hsub(lt-1,unit); //高精度减法.个位以外的数 - 个位*5 for(i=lt-1;i>=2;i--) { hsub(i,unit); unit=num[i]*5; } if((num[0]*100+num[1]*10+num[2])%17==0) return1; else return0; } voidhsub(intl,intsubt) //减数最大为45;hi存十位,li存个位 { intsign=0; inthi; intli; inti; hi=subt/10; li=subt-hi*10; if(num[l]>=li) num[l]-=li; else { num[l]+=(10-li); sign=1; } if(num[l-1]>=sign+hi) { num[l-1]-=(sign+hi); sign=0; } else { num[l-1]+=(10-sign-hi); sign=1; } if(sign==1) for(i=l-2;i>=0;i--) { if(num[i]!=0) { num[i]-=sign; break; } else num[i]=9; } }