原題要求用c++做的,不過(guò)用模擬精靈比較快,但未仔細(xì)分析優(yōu)化。
第一題 連續(xù)正整數(shù)(10分)
題目描述:一個(gè)正整數(shù)有可能可以被表示為n(n>=2)個(gè)連續(xù)正整數(shù)之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8
請(qǐng)編寫程序,根據(jù)輸入的任何一個(gè)正整數(shù),找出符合這種要求的所有連續(xù)正整數(shù)序列。
輸入數(shù)據(jù):一個(gè)正整數(shù),以命令行參數(shù)的形式提供給程序。
輸出數(shù)據(jù):在標(biāo)準(zhǔn)輸出上打印出符合題目描述的全部正整數(shù)序列,每行一個(gè)序列,每個(gè)序列都從該序列的最小正整數(shù)開(kāi)始、以從小到大的順序打印。如果結(jié)果有多個(gè)序列,按各序列的最小正整數(shù)的大小從小到大打印各序列。此外,序列不允許重復(fù),序列內(nèi)的整數(shù)用一個(gè)空格分隔。如果沒(méi)有符合要求的序列,輸出“NONE”。
例如,對(duì)于15,其輸出結(jié)果是: 1 2 3 4 5 4 5 6 7 8
對(duì)于16,其輸出結(jié)果是: NONE
評(píng)分標(biāo)準(zhǔn):程序輸出結(jié)果是否正確。
print(str);
while( nStop() ) do delay(100)
print("按".._STOPHKEY..",然后輸入一個(gè)數(shù)字退出程序") print("請(qǐng)輸入一個(gè)正整數(shù):")
ns = io.read();
while( nStop() and ( not tonumber(ns) ) )do print("請(qǐng)輸入一個(gè)有效整數(shù)"); ns = io.read(); end
n = tonumber(ns)
print("")
for i=1,n/2+1,1 do local k = 0; local j2 =0; for j =i,n/2+1,1 do k = k + j; j2=j; if(k == n) then break end; end;
if(k==n)then local out = n.." = "..i; for y=i+1,j2,1 do out = out.." + "..y end; print(out); end; end;
print("")
end;
第二題 重疊區(qū)間大小(20分)
題目描述:請(qǐng)編寫程序,找出下面“輸入數(shù)據(jù)及格式”中所描述的輸入數(shù)據(jù)文件中最大重疊區(qū)間的大小。
對(duì)一個(gè)正整數(shù)n,如果n在數(shù)據(jù)文件中某行的兩個(gè)正整數(shù)(假設(shè)為A和B)之間,即A<><=b或a>=n>=B,則n屬于該行;如果n同時(shí)屬于行i和j,則i和j有重疊區(qū)間;重疊區(qū)間的大小是同時(shí)屬于行i和j的整數(shù)個(gè)數(shù)。
例如,行(10 20)和(12 25)的重疊區(qū)間為[12 20],其大小為9;行(20 10)和(12 18)的重疊區(qū)間為[10 12],其大小為3;行(20 10)和(20 30)的重疊區(qū)間大小為1。
輸入數(shù)據(jù):程序讀入已被命名為input.txt的輸入數(shù)據(jù)文本文件,該文件的行數(shù)在1到1,000,000之間,每行有用一個(gè)空格分隔的2個(gè)正整數(shù),這2個(gè)正整數(shù)的大小次序隨機(jī),每個(gè)數(shù)都在1和2^32-1之間。(為便于調(diào)試,您可下載測(cè)試input.txt文件,實(shí)際運(yùn)行時(shí)我們會(huì)使用不同內(nèi)容的輸入文件。) 輸出數(shù)據(jù):在標(biāo)準(zhǔn)輸出上打印出輸入數(shù)據(jù)文件中最大重疊區(qū)間的大小,如果所有行都沒(méi)有重疊區(qū)間,則輸出0。
評(píng)分標(biāo)準(zhǔn):程序輸出結(jié)果必須正確,內(nèi)存使用必須不超過(guò)256MB,程序的執(zhí)行時(shí)間越快越好。 print(str);
--沒(méi)這個(gè)文本,簡(jiǎn)單的寫一個(gè) -- txt = string.load("input.txt")
txt = [[12 20 20 32 1 25 6 7 11 5 6 4 6 8 1 3 2 23 11 22 1 32 4 18 ]]
tab = string.split( txt ,"\n"); --把多行拆分到一個(gè)數(shù)組
for k,v in pairs(tab) do local t = string.split( v.." " ," ") --把當(dāng)前值拆分成前后兩個(gè)數(shù)字 tab[k] = { tonumber(t[1]),tonumber(t[2]) }; end;
n = 0;
for k,x in pairs(tab) do sleep(1); local start_n = 0; local end_n = 0; for k,y in pairs(tab) do sleep(1); if( ( x[1] > y[1] ) and ( x[1] < y[2]="" )="" )then=""> start_n = x[1];
if(x[2] < y[2])then=""> end_n = x[2]; else end_n = y[2]; end; elseif( ( y[1] > x[1] ) and ( y[1] < x[2]="" )="" )then=""> start_n = y[1]; if(x[2] < y[2])then=""> end_n = x[2]; else end_n = y[2]; end; end; end;
local n2 = end_n - start_n; if(n2 > n)then n = n2; end; end;
print("最大重疊區(qū)間大小"..n);
delay( _CMD_LOOP )
]]> 腳本區(qū)塊> <數(shù)據(jù)區(qū)塊>數(shù)據(jù)區(qū)塊> [1] [2] 下一頁(yè) =b或a>
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!