什麼是最好的方法來找到兩個給定數字之間的二進制表示是迴文的總數字? The problem I am trying to solve is here on spoj http://www.spoj.com/problems/BINPALI/如何查找二進制表示爲迴文的數字總數?
回答
我解決了這個問題SPOJ和代碼如下:
#include<iostream>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<string>
using namespace std;
int main()
{
int a,b,t;
cin>>t;
while(t--)
{
cin>>a>>b;
int total=0;
string s="";
while(a<=b)
{
s="";
for(int i=a;i>0;i=i/2)
{
if(i%2)
s+='1';
else
s+='0';
}
string s2="",s3="";
s2=s.substr(0,s.length()/2);
int k=s.length();
if(k%2)
s3=s.substr(s.length()/2+1,s.length());
else
s3=s.substr(s.length()/2,s.length());
reverse(s2.begin(),s2.end());
if(s2==s3)
{
cout<<a<<" ";
total++;
}
a++;
}
if(!total)
cout<<"none"<<endl;
}
return 0;
}
這是否被接受? – prime
一個可行的方法是:
採取第1個數字的二進制表示M.
找到第一個數字大於M是迴文的二進制形式:
- 對於M ,保留左半部分,相同的值,並將二進制字符串的右半部分與左半部分匹配。
For example if M is 10110111, the number shall be 10111101
如果產生的數是< M,則遞增1左子串,然後匹配的權利串。
Eg. if M is 10000011, the number shall be 10000001 < M , hence number shall be 10011001.
要查找後續數字,請從中間向末尾增加位。
10011001
10100101
10111101
11000011
這個問題對時間限制非常嚴格。即使是優化的迴文發生器也可能無法工作。對於給定的整數序列,您可能必須使用formula at OEIS。
還有一個反轉公式。它給出如下。如果b> 0是任何二元迴文,那麼其中a(n)= b的索引n是 n = palindromicIndexOf(b)=(((5 - ( - 1)^ m)/ 2)+ sum_ {k = 1 ... floor(m/2)}(floor(b/2^k)mod 2)/ 2^k))* 2^floor(m/2),其中m = floor (log_2(b))。
您可能不得不採取兩個給定的索引,並以某種方式從序列中找出最低的n和最高的n。然後在範圍內(最低n,最高n)打印出序列中的所有第n個數字。第n個二進制迴文數的每個查詢都是O(1)次,因此每個測試用例應該採用O(log(B-A))時間。這是非常低的,但你需要得到公式的工作。 :)
祝你好運實現這個序列的發電機公式。我試過了,無法啓動它。 :(這是相當複雜的。
但不管怎麼說參考,我試着在Python 2.7.5使用優化的迴文發生器,它給了我超出時間限制。這裏是代碼,如果你有興趣。
from itertools import product, repeat
from bisect import insort, bisect
def all_binary_sequences_of_length_(n):
return [''.join(seq) for seq in product('01', repeat=n)]
def main():
binary_palindromes = [0, 1, 3, 5, 7]
for n in xrange(1, 15):
A = all_binary_sequences_of_length_(n)
for a in A:
b = a[::-1]
# Add palindromes of length 2n + 2
insort(binary_palindromes, int((a+b).join('11'), 2))
# Add palindromes of length 2n + 3
insort(binary_palindromes, int((a+'0'+b).join('11'), 2))
insort(binary_palindromes, int((a+'1'+b).join('11'), 2))
t = int(raw_input())
for _ in repeat(0, t):
a, b = map(int, raw_input().split())
start = bisect(binary_palindromes, a - 1)
end = bisect(binary_palindromes, b)
output = [str(binary_palindromes[i]) for i in xrange(start, end)]
if len(output) == 0:
print 'none'
else:
print ' '.join(output)
if __name__ == '__main__':
main()
我知道Python是不是一個非常快的語言,但只需要1秒的時間限制使我相信,只有這樣,才能解決這個問題是在OEIS使用公式。:)
你讓它變得如此複雜! –
Python很強大!不要讓它變得複雜!呃,有點慢!
for _ in range(input()):
has = False
x,y = map(int, raw_input().split())
for i in range(x,y+1):
temp = bin(i)
temp = temp[temp.index('b')+1:]
if temp[::-1] == temp:
has = True
print i,
if not has:
print "none"
- 1. 在Sagemath中總結表示分數的二進制數字
- 2. 非整數數字二進制表示
- 3. 查找表中有二進制數據
- 4. 如何在表示二進制文件的字符串中找到整數
- 5. 數字的二進制表示
- 6. 如何將數字(十進制)轉換爲二進制(二進制)數字和從二進制到十進制?
- 7. 如何將二進制數字轉換爲八進制數字?
- 8. 如何用二進制表示整數
- 9. 如何從二進制數總成8086
- 10. 將二進制數字轉換爲二進制數字
- 11. 回報,我能找到的數字的二進制表示A * B
- 12. 查找最左邊的二進制數
- 13. 如何在二進制表示中找到long int中的數字? C++
- 14. pgsql的數字/十進制二進制表示,可可
- 15. 如何將整數轉換爲VHDL中的二進制表示?
- 16. 將二進制字符串表示轉換爲字節數組
- 17. 用二進制補碼查找二進制數,C
- 18. Go - 將表示二進制數的字符串轉換爲int
- 19. 如何按二進制表示法對二進制數組進行排序
- 20. 爲什麼程序不在Text.txt中返回二進制數字,因爲它從Image.jpeg複製二進制數字
- 21. 寫的字符串二進制數據的二進制文件
- 22. 用十進制數表示的二進制浮點數
- 23. 有符號二進制數字char * of 2s恭維二進制表示的char * *?
- 24. 雙數的二進制表示
- 25. 二進制數的IEEE表示法
- 26. 如何將十六進制數字轉換爲C++中的二進制文件?
- 27. 將二進制數據(例如二進制文件)導出爲.NET字符串?
- 28. 將十進制數字轉換爲6位二進制數字
- 29. 將數字顯示爲來自綁定源的二進制數
- 30. 如何編寫一個二進制數字填充零的二進制文件?
到目前爲止您可以得到的最佳方法是什麼? –
@AbhishekBansal直到現在我才能想到一個簡單的方法。 –
如果您發佈您的嘗試,您更有可能獲得更好的回覆。 –