(1 5 2 8)找出相乘結果只有0和1的整數

2021-07-01 23:04:04 字數 2531 閱讀 9757

題目:任意給定乙個正整數n,求乙個最小的正整數m(m>1),使得n*m的十進位制表示形式裡只含有1和0.

解決這個問題首先考慮對於任意的n,是否這樣的m一定存在。可以證明,m是一定存在的,而且不唯一。

簡單證明:因為

這是乙個無窮數列,但是數列中的每一項取值範圍都在[0, n-1]之間。所以這個無窮數列中間必定存在迴圈節。即假設有s,t均是正整數,且s例如,取n=3,因為10的任何非負次方模3都為1,所以迴圈節週期為1.有:

給定n,求m的方法:

方法一:給定n,令m從2開始,列舉m的值直到遇到乙個m使得n*m的十進位制表示中只有1和0.

方法二:求出10的次方序列模n的餘數序列並找出迴圈節。然後搜尋這個餘數序列,搜尋的目的就是要在這個餘數序列中找到一些數出來讓它們的和是n的倍數。例如n=13,這個序列就是1,10,9,12,3,4然後不斷迴圈。很明顯有1+12=13,而1是10的0次方,12是10的3次方,所以這個數就是1000+1=1001,m就是1001/13=77。

方法三:因為n*m的取值就是1,10,11,100,101,110,111,......所以直接在這個空間搜尋,這是對方法一的改進。搜尋這個序列直到找到乙個能被n整除的數,它就是n*m,然後可計算出m。例如n=3時,搜尋樹如下:

上圖中括號內表示模3的餘數。括號外表示被搜尋的數。左子樹表示0,右子樹表示1.上圖中搜尋到第二層(根是第0層)時遇到111,它模3餘數為0.所以n*m=111, m=111/3=37。

方法四:對方法三的改進。將方法三的搜尋空間按模n餘數分類,使得搜尋時間和空間都由原來的指數級降到了o(n)。改進的原理:假設當前正在搜尋由0,1組成的k位十進位制數,這樣的k位十進位制數共有2^k個。假設其中有兩個數x、y,它們模n同餘,那麼在搜尋由0、1組成的k+1位十進位制數時,x和y會被擴充套件出四個數:10x, 10x+1, 10y, 10y+1。因為x和y同餘(同餘完全可以看作相等),所以10x與10y同餘,10x+1與10y+1同餘。也就是說由y擴充套件出來的子樹和由x擴充套件產生出來的子樹產生完全相同的餘數,如果x比y小,那麼y肯定不是滿足要求的最小的數,所以y這棵子樹可以被剪掉。這樣,2^k個數按照模n餘數分類,每類中只保留最小的那個數以供擴充套件。原來在這一層需要搜尋2^k個數,現在只需要搜尋o(n)個數。例如,當n=9時,第0層是1(1),

如上圖所示,第2層的110,第三層的1010、1110都因為同一層有和它同餘且更小的數而被剪掉。如果按照方法三搜尋,第三層本來應該有8個結點,但現在只有4個結點。

方法一的源**:

[cpp]view plain

copy

#include 

inthasonlyoneandzero(unsigned 

intn)   

return

1;  

}  int

main()   

}  }  

return

0;  

}  

方法三的源**:

[cpp]view plain

copy

// 解法三(1):廣度優先搜尋

#define _crt_secure_no_warnings 1

#include 

#include 

using

namespace

std;  

intmain()   

q.push(t * 10);  

q.push(t * 10 + 1);  

}  }  

return

0;  

}  

方法四源**:

[cpp]view plain

copy

// 解法四:將搜尋空間分過類的廣度搜尋,這樣空間占用是o(n)而不是

// 指數級。分類的原則是按照模n的餘數分類 

#define _crt_secure_no_warnings 1

#include 

#include 

#include 

#include 

using

namespace

std;  

struct

qnode   

qnode(): v(0), r(0) {}  

};  

intmain()   

q.pop();  

if(!bn[t.r * 10 % n])   

if(!bn[(t.r * 10 + 1) % n])   

}  }  

ok:;  

}  return

0;  

}  

為什麼只看重結果 不要只看重結果,過程也是美麗的

我只看結果,不看過程,這句話在時下社會裡頗為常見,往往是領導對員工最為常見的一句話。生活中,一些人為達目的不擇手段,只要能得到預期的結果,哪會去在意過程如何?喜歡外出郊遊的朋友們,往往驅車千里到達目標景點,卻發現並不像預期那樣景色宜人,卻忘記了去欣賞沿途的無限風景。是的,結果很重要,但過程一樣美麗。...

生成兩數相乘結果的螺旋陣列

有人問到乙個演算法 兩數相乘,生成乙個螺旋陣列。舉例說明 3 4 生成的螺旋陣列為 1 2 3 4 10 11 12 5 9 8 7 6 5 6 生成的螺旋陣列為 1 2 3 4 5 6 18 19 20 21 22 7 17 28 29 30 23 8 16 27 26 25 24 9 15 14...

mysql修改查詢出來結果

需求 之前漢字轉拼音時候發覺有個字母 轉換錯了,應該是v才對,實際上 也沒錯,但是在計算機拼音中 是用v表示的,所以要把表中的 全部轉換為v 一開始覺得這個sql應該也不難,先查詢出來所有的符合條件的然後update 寫出來了發現報錯了。you can t specify target table ...