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("1\n");
else printf("0\n");
}
}


//題意做法
#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("1\n") ;
else printf("0\n") ;
}
return 0 ;
}







注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com