HHUOJ 1003 数字整除(模拟大数整除)
1003: 数字整除时间限制: 1 Sec??内存限制: 128 MB提交: 10??解决: 7 题目描述定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的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表示否。 样例输入34 201 2098765413 1717171717171717171717171717171717171717171717171718 0 样例输出1 0 1 0 提示来源湖南省第六届大学生计算机程序设计竞赛 思路: 大数模拟的练习题,因为有很大很大的数所以只能用大数高精度。觉得题意的定理实现起来有点麻烦..所以直接用的大数。我们在进行除法运算的时候,就是从最高位开始,如果不能整数则这位商0,然后这位*10+下一位,再进行除法。如果可以除掉,那么商数余一个余数,然后再不能除就*10,这个题就是模拟的这个过程。 当然如果按照题意也能做,去网上搜了一下用题目定理写的AC代码,也贴到后边了。 代码: //大数模拟 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int main() { //freopen("in.txt","r",stdin); char s[110]; while(scanf("%s",s)!=EOF&&strcmp(s,"0")!=0) { int len=strlen(s); int re=0; for(int i=0;i<len;i++) { if(re<17) { re=re*10+s[i]-'0'; } else { re=re%17*10+s[i]-'0'; } } if(re%17==0)printf("1n"); else printf("0n"); } } //题意做法 #include<stdio.h> #include<string.h> int main() { int i,x,m ; char s[1001] ; while(scanf("%s",s)!=EOF && strcmp(s,"0")) { int h=strlen(s) ; x=(s[h-1]-'0')*5 ; h-- ; m=0 ; for(i=0;i<h;i++) { m=s[i]-'0'+m ; if(m<17) { m=m*10 ; } else m=(m%17)*10 ; } if(m/10==x%17) printf("1n") ; else printf("0n") ; } return 0 ; } (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |