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 ;
}
(编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


