首页 > 代码库 > 1412192154-hpu-数字整除
1412192154-hpu-数字整除
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; }
1412192154-hpu-数字整除
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。