當乙個數n的質因子只含有2,3,5的時候,我們可以將n稱為235數(事實上叫醜數)。
那麼,問題來了,給你乙個數n,你能求出第乙個大於等於n的235數是多少嗎?程式設計解決這個簡單的問題吧~
輸入多組輸入
第1行:乙個數t,表示後面用作輸入測試的數的數量。(1 <= t <= 30000)
第2 - t + 1行:每行1個數n(1 <= n <= 10^18)
輸出共t行,每行1個數,輸出》= n的最小235數。
分析:本題,我卡了許久許久,要不答案錯誤,要不時間超限。本地的基本思路為打表,不過此打表也是要有點技術的打表。不是一般的打表。我在打表之後,發現時間還是超限。最終有借助二分查詢法得出最後的結論。真的是可怕。
#include"stdio.h"
long long a[13000];
long long count=1;//打表的個數下標
long long min(long long chen2,long long chen3,long long chen5)//判斷最小的
long long find()//開始打表
for(i=0; ia[count-1])
for(i=0; ia[count-1])
a[count]=min(chen2,chen3,chen5);//將以上三個數中的最小數放入陣列中
count++;//表下標
if(a[count]>=1e18)//當數大於1e18了,就可以退出了
break;
}}long long er(long long m,long long min,long long end)//這裡是二分查詢
if(a[mid]>m)
else
}return a[mid];
}int main()}}
}
but當我看了其他人的程式後,內心**,真的絕望。我發現他們的打表是十分簡潔的。以至於他們不需要使用二分查詢。現將**複製如下:
#includelong long min(long long x,long long y)//查詢最小值
long long fun(long long n,long long *num)
}void find(long long n,long long *num,int *index)//直接查詢下標。沒有使用二分
}int main()
return 0;
}
醜數(因子只有 2 3 5 的數)
理解題意關鍵 如果說乙個數的因子只有 2 3 5 那麼反過來想,這個數一定是由若干個 2 3 5 相乘得到的,所以每一次只需要找出當前所有已知醜數中由2 3 5 相乘可以得到的最小的數即可。也就是說每乙個醜數,都可以由之前的醜數乘 2 3 5 得到。具體做法 設定三個指標,初始他們都指向第乙個醜數 ...
只包含因子2 3 5的數
k的因子中只包含2 3 5。滿足條件的前10個數是 2,3,4,5,6,8,9,10,12,15。所有這樣的k組成了乙個序列s,現在給出乙個數n,求s中 給定數的最小的數。例如 n 13,s中 13的最小的數是15,所以輸出15。input 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t ...
例題分享 2 3 5抽數
把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。主要就是利用類似於遞迴的思想,或者說是分解 法的方法。方法一 每乙個醜分解之後只有2 3 5,假設乙個數是x,有x 2 i...