這裏所謂的“光棍”,並不是指單身汪啦~ 說的是全部由1組成的數字,比如1、11、111、1111等。傳說任何一個光棍都能被一個不以5結尾的奇數整除。比如,111111就可以被13整除。 現在,你的程序要讀入一個整數x
,這個整數一定是奇數並且不以5結尾。然後,經過計算,輸出兩個數字:第一個數字s
,表示x
乘以s
是一個光棍,第二個數字n
是這個光棍的位數。這樣的解當然不是唯一的,題目要求你輸出最小的解。
提示:一個顯然的辦法是逐漸增加光棍的位數,直到可以整除x
爲止。但難點在於,s
可能是個非常大的數 —— 比如,程序輸入31,那麼就輸出3584229390681和15,因爲31乘以3584229390681的結果是111111111111111,一共15個1。
輸入格式:
輸入在一行中給出一個不以5結尾的正奇數x
(<1000)。
輸出格式:
在一行中輸出相應的最小的s
和n
,其間以1個空格分隔。
輸入樣例:
31
輸出樣例:
3584229390681 15
題目思路分析:
第一次接觸大數除法的模擬,在經歷過一番思考後,選擇了百度。。。
忽然發現思路其實就是模擬人的思路:假設我們也不知道多少個1才能將31整除。那麼怎麼得到那個很長的數呢?
- 從1,11,111,一個一個去嘗試。顯然,不成立。(當然,我們可以直接從比除數大的111開始除,這也是後面變成的思路)
- 但如果我們實驗過幾次第一種方法後,我們會發現,其實我們只是在每一次的計算後(發現不能整除)我們就會添加一個1繼續去除。之前的商就保留下來了,和我們使用豎式除法是一樣的。我們只是需要每次除不盡的時候,填上一個1繼續除便是了,之前的商直接輸出不是更好。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x,s=0,n=0;//除數,被除數,位數
cin>>x;
while(s<x)
{
s=s*10+1;//被除數末位添1直到不小於被除數
n++;
}
while(true)//除法
{
cout<<s/x;//輸出商(就作爲開頭咯)
s%=x;//被除數更改爲其餘數
if(s==0)break;//餘數爲0則結束(否則加1繼續)
s=s*10+1;//被除數末位加上1
n++;
}
cout<<' '<<n;//之前已經輸出了商(很大的數)
return 0;
}
大數模擬,在沒有更好的方法下,不如試試康康如果是我們,我們是怎麼做的。。。