問題:
任意給定乙個正整數n,求乙個最小的正整數m(m>1),使得n*m的十進位制表示形式裡只含有1和0。
思路:
建立模n的餘數記錄表,通過動態規劃的思想找到相應的m;
例子:
當n=3時:
record110
1000
111112
11 當j=1時,j%n=1,更新record。
當j=10時,j%n=1存在且1比10小,不更新;但(1+j)%n=2,更新record;
當j=100時,j%n=1存在且1比100小,不更新;(j+1)%n=2存在且11比101小,不更新;(j+11)%n=0,更新record;
此時發現record[0]不為空,找到n*m,返回m
**:
#include #include using namespace std;
long long findconditionnumber(long long var)
vectorrecord(var);
for (int i=0;;i++)
//update
for (int k=0;k該記錄 3.j與該記錄相加所得的餘數沒有記錄
if (record[k]!=0&&j>record[k]&&record[(record[k]+j)%var]==0)
}if (!isupdate)
//find the condition number
if (record[0]!=0)
}}int main()
{ long long v;
while (cin>>v)
{ cout<
程式設計之美2 8 找符合條件的整數
問題 任意給定乙個正整數n,求乙個最小的正整數m m 1 使得n m的十進位制表示形式裡只含有1和0。解法 由於沒有直接的數學方法能幫我們直接得到m的值,所以我們只能進行搜尋。由於相對m,乘積n m具有明顯的特徵,需要搜尋的空間要小很多,所以我們對乘積n m進行搜尋。如果n m的結果有k位,則要迴圈...
程式設計之美2 8 找符合條件的整數
這個題目是,給定乙個整數 n,需要尋找另外乙個整數 m,使得 n m 得到的結果十進位制表示中只存在1和0兩個數字。首先看到這個題目,第一思想肯定是 使 m 1,並依此遞增 m 的值,直到 n m 獲得想要的效果,但是,如果 n 很大呢,那麼計算量也是很大的,所以,我們需要尋求更好的解決辦法。書中提...
程式設計之美2 8 找符合條件的整數
書上面講的很好,程式也寫得很巧妙。最主要的一句話 只需要將10k n的結果與餘數資訊陣列裡非空的元素相加,再去模n,看看會不會出現新的餘數。include include using namespace std vectorfind number int n bigint 1 push back 0...