L1-046整除光棍(模擬大數除法)

這裏所謂的“光棍”,並不是指單身汪啦~ 說的是全部由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)。

輸出格式:

在一行中輸出相應的最小的sn,其間以1個空格分隔。

輸入樣例:

31   

輸出樣例:

3584229390681 15

題目思路分析:

第一次接觸大數除法的模擬,在經歷過一番思考後,選擇了百度。。。

忽然發現思路其實就是模擬人的思路:假設我們也不知道多少個1才能將31整除。那麼怎麼得到那個很長的數呢?

  1. 從1,11,111,一個一個去嘗試。顯然,不成立。(當然,我們可以直接從比除數大的111開始除,這也是後面變成的思路)
  2. 但如果我們實驗過幾次第一種方法後,我們會發現,其實我們只是在每一次的計算後(發現不能整除)我們就會添加一個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;
}

大數模擬,在沒有更好的方法下,不如試試康康如果是我們,我們是怎麼做的。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章