亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
求教用awk怎樣湊數(shù)字
[打印本頁]
作者:
54nwq
時間:
2015-03-02 15:11
標(biāo)題:
求教用awk怎樣湊數(shù)字
有如下一列文本
43.11
56.27
88
7.22
4.77
38.59
95.09
64.04
66.61
54.99
54.77
34.83
3.23
4.75
80.26
12.9
77.26
28.17
78.01
68.87
83.95
12.29
79.08
復(fù)制代碼
求哪些數(shù)據(jù)相加的和為275.32,答案不止一個,列出所有可能的組合,如下所示:
1、95.09 + 54.77 + 3.23 + 12.9 + 28.17 + 68.87 + 12.29 = 275.32
2、38.59 + 66.61 + 54.77 + 3.23 + 28.17 + 83.95 = 275.32
。。。。。。
謝謝!
作者:
liaosnet
時間:
2015-03-02 17:33
不停的循環(huán)~
作者:
stupid_lee
時間:
2015-03-02 17:57
要用到數(shù)學(xué)上的排列組合了,趕腳好復(fù)雜,坐等大神答案
作者:
zsszss0000
時間:
2015-03-02 18:31
這個只能坐等SHELL版的大神來解答了。
作者:
我是一隻羊
時間:
2015-03-02 18:44
目測jason大神要來發(fā)功了...
作者:
cao627
時間:
2015-03-02 22:25
awk '{a[++i]=$1;b[i]=0}END{for(k=1;k<=2**i;k++){sum=0;n=k;j=0;while(n!=0){b[++j]=n%2;n=(n-n%2)/2};for(j=1;j<=i;j++){sum+=a[j]*b[j]};if(sum=="275.32"){for(j=1;j<=i;j++){if(b[j]!=0)print a[j]};print "***"}}}' file
復(fù)制代碼
作者:
我是一隻羊
時間:
2015-03-02 23:06
回復(fù)
6#
cao627
二進(jìn)制線性方程系數(shù),贊一個.
作者:
zsszss0000
時間:
2015-03-03 12:01
寫的確實(shí)漂亮,還有效率更高的算法嗎?
作者:
sync_1521
時間:
2015-03-03 12:14
回復(fù)
6#
cao627
能解釋下么 看不太懂。。
作者:
zsszss0000
時間:
2015-03-03 12:34
本帖最后由 zsszss0000 于 2015-03-03 12:35 編輯
a[i]*b[i]對這個進(jìn)行求和。
a[i]是文件中的數(shù)字
b[i]=0或者1,如果取0相當(dāng)于a[i]不參加求和運(yùn)算,如果b[i]=1相當(dāng)于參與求和
復(fù)制代碼
回復(fù)
9#
sync_1521
作者:
jason680
時間:
2015-03-03 12:35
本帖最后由 jason680 于 2015-03-03 12:53 編輯
@zsszss0000
@54nwq
Here you are with good performance
$ time awk -v
v=275.32
'function x(v,s,c,t,p,y){if(s-c>1)while(++p<=NR-s+c)x(v,s,c+1,t+a[p],p,y a[p]"
("p")
+");else{
if(t+max<v||v<t+min)return
;while(++p<=NR){if(v==t+a[p]){cnt++;print v"="y a[p]"("p")"}}}}{a[NR]=$1;N=NR;
if(NR==1)max=min=$1;if(max<$1)max=$1;if(min>$1)min=$1
;printf $1"
("NR")
, "}END{print "\nmax="max", min="min;for(n=1;n<=NR;n++)x(v,n);print "got total:"cnt}' FILE
43.11(1), 56.27(2), 88(3), 7.22(4), 4.77(5), 38.59(6), 95.09(7), 64.04(8), 66.61(9), 54.99(10), 54.77(11), 34.83(12), 3.23(13), 4.75(14), 80.26(15), 12.9(16), 77.26(17), 28.17(18), 78.01(19), 68.87(20), 83.95(21), 12.29(22), 79.08(23),
max=95.09, min=3.23
275.32=43.11
(1)
+64.04
(8)
+12.9
(16)
+77.26
(17)
+78.01
(19)
...
275.32=4.77(5)+38.59(6)+95.09(7)+34.83(12)+3.23(13)+4.75(14)+12.9(16)+68.87(20)+12.29(22)
got total:23
real 0m15.366s
user 0m12.925s
sys 0m0.252s
$ time awk -vv=275.32 'function x(v,s,c,t,p,y){
if(t>v)return;
if(s-c>1)while(++p<=NR-s+c)x(v,s,c+1,t+a[p],p,y a[p]"("p")+");else{if(t+max<v||v<t+min)return;while(++p<=NR){if(v==t+a[p]){cnt++;print v"="y a[p]"("p")"}}}}{a[NR]=$1;N=NR;if(NR==1)max=min=$1;if(max<$1)max=$1;if(min>$1)min=$1;printf $1"("NR"), "}END{print "\nmax="max", min="min;for(n=1;n<=NR;n++)x(v,n);print "got total:"cnt}' FILE
43.11(1), 56.27(2), 88(3), 7.22(4), 4.77(5), 38.59(6), 95.09(7), 64.04(8), 66.61(9), 54.99(10), 54.77(11), 34.83(12), 3.23(13), 4.75(14), 80.26(15), 12.9(16), 77.26(17), 28.17(18), 78.01(19), 68.87(20), 83.95(21), 12.29(22), 79.08(23),
max=95.09, min=3.23
275.32=43.11(1)+64.04(8)+12.9(16)+77.26(17)+78.01(19)
...
275.32=4.77(5)+38.59(6)+95.09(7)+34.83(12)+3.23(13)+4.75(14)+12.9(16)+68.87(20)+12.29(22)
got total:23
real 0m
3.029s
user 0m1.720s
sys 0m0.068s
real 0m
3.123s
user 0m1.820s
sys 0m0.124s
real 0m
2.852s
user 0m1.748s
sys 0m0.096s
Note: run three times
作者:
54nwq
時間:
2015-03-03 13:50
jason680 發(fā)表于 2015-03-03 12:35
@zsszss0000 @54nwq
Here you are with good performance
太厲害了,佩服,謝謝
作者:
54nwq
時間:
2015-03-03 13:52
回復(fù)
6#
cao627
謝謝幫助,你好厲害。
作者:
goofool
時間:
2015-03-03 14:42
回復(fù)
11#
jason680
雖然我沒看懂,但是這段代碼應(yīng)該有問題
我把LZ的數(shù)據(jù)sort了一下,用這段代碼出來結(jié)果就不一樣了
sort -n test | awk ... test
....
got total:28
復(fù)制代碼
作者:
goofool
時間:
2015-03-03 14:43
回復(fù)
11#
jason680
我用窮舉算出來是42
作者:
reyleon
時間:
2015-03-03 14:46
回復(fù)
11#
jason680
結(jié)果確實(shí)有問題, 不止 23 種組合.
作者:
54nwq
時間:
2015-03-03 14:50
回復(fù)
15#
goofool
確實(shí)結(jié)果是42種
作者:
zsszss0000
時間:
2015-03-03 14:51
的確 我驗(yàn)證了下,也出現(xiàn)了你這種情況
回復(fù)
14#
goofool
作者:
zsszss0000
時間:
2015-03-03 14:52
你窮舉的方法是怎么樣的?
回復(fù)
15#
goofool
作者:
goofool
時間:
2015-03-03 14:56
回復(fù)
19#
zsszss0000
把所有組合列出來,對每個組合求和,然后和275.32比較
不知道有沒有好算法,這種太不討好了,baidu半天也沒找到
作者:
54nwq
時間:
2015-03-03 15:00
1: 95.09+88+80.26+7.22+4.75
2: 95.09+78.01+43.11+34.83+12.29+7.22+4.77
3: 95.09+68.87+54.77+28.17+12.9+12.29+3.23
4: 95.09+68.87+38.59+34.83+12.9+12.29+4.77+4.75+3.23
5: 95.09+66.61+54.99+43.11+12.29+3.23
6: 95.09+54.99+54.77+34.83+12.9+12.29+7.22+3.23
7: 88+78.01+56.27+28.17+12.9+7.22+4.75
8: 88+77.26+56.27+38.59+7.22+4.75+3.23
9: 88+68.87+54.99+38.59+12.9+7.22+4.75
10: 88+64.04+56.27+38.59+12.9+12.29+3.23
11: 88+56.27+54.77+43.11+12.9+12.29+4.75+3.23
12: 88+56.27+54.77+38.59+28.17+4.77+4.75
13: 83.95+80.26+43.11+34.83+12.9+12.29+4.75+3.23
14: 83.95+80.26+38.59+34.83+28.17+4.77+4.75
15: 83.95+77.26+43.11+38.59+12.9+12.29+7.22
16: 83.95+77.26+43.11+34.83+28.17+4.77+3.23
17: 83.95+68.87+56.27+34.83+28.17+3.23
18: 83.95+66.61+54.77+38.59+28.17+3.23
19: 80.26+78.01+56.27+43.11+12.9+4.77
20: 80.26+64.04+54.99+43.11+28.17+4.75
21: 80.26+56.27+54.99+54.77+12.29+7.22+4.77+4.75
22: 80.26+56.27+54.99+38.59+28.17+12.29+4.75
23: 79.08+78.01+54.77+38.59+12.9+7.22+4.75
24: 79.08+77.26+54.99+43.11+12.9+4.75+3.23
25: 79.08+68.87+66.61+43.11+12.9+4.75
26: 79.08+64.04+54.99+38.59+28.17+7.22+3.23
27: 79.08+54.99+54.77+43.11+28.17+7.22+4.75+3.23
28: 78.01+77.26+64.04+43.11+12.9
29: 78.01+77.26+56.27+38.59+12.9+12.29
30: 78.01+68.87+54.99+34.83+28.17+7.22+3.23
31: 78.01+64.04+54.77+43.11+28.17+7.22
32: 78.01+64.04+43.11+38.59+34.83+7.22+4.77+4.75
33: 78.01+56.27+54.77+38.59+28.17+12.29+7.22
34: 77.26+64.04+54.99+54.77+12.29+7.22+4.75
35: 77.26+56.27+54.99+43.11+28.17+12.29+3.23
36: 77.26+54.77+43.11+34.83+28.17+12.9+12.29+7.22+4.77
37: 68.87+66.61+56.27+43.11+28.17+12.29
38: 68.87+64.04+54.77+38.59+28.17+12.9+4.75+3.23
39: 68.87+56.27+54.77+34.83+28.17+12.9+12.29+7.22
40: 66.61+64.04+54.99+43.11+38.59+4.75+3.23
41: 66.61+56.27+54.99+43.11+34.83+12.29+7.22
42: 64.04+54.99+54.77+38.59+34.83+12.9+7.22+4.75+3.23
復(fù)制代碼
作者:
bikkuri
時間:
2015-03-03 15:32
把這些數(shù)排序以后可以發(fā)現(xiàn)最小的十一個數(shù)的和已經(jīng)大于275.32了,而最大的兩個數(shù)的和還小于275.32。
所以如何一個符合條件的組合,即和等于275.32的組合,一定由3-10個數(shù)組成。
少于3個數(shù)或者超過10個數(shù)的組合就不用窮舉了,可以直接排除。
作者:
zsszss0000
時間:
2015-03-03 16:01
漂亮,這樣可以一下子消除好多根本就不可能的選擇,提高了效率。
回復(fù)
22#
bikkuri
作者:
jason680
時間:
2015-03-03 16:30
本帖最后由 jason680 于 2015-03-03 16:36 編輯
回復(fù)
16#
reyleon
It's floating number(Floating-Point Arithmetic) issue
http://zh.wikipedia.org/zh-cn/IEEE_754
There is no issue for integer number
$ time awk -vv=275.32 'function x(v,s,c,t,p,y){if(t>v)return;if(s-c>1)while(++p<=NR-s+c)x(v,s,c+1,t+a[p],p,y a[p]"("p")+");else{if(t+max<v||v<t+min)return;while(++p<=NR){if(
v==t+a[p]
){cnt++;print v"="y a[p]"("p")"}}}}{
$1*=100
;a[NR]=$1;N=NR;if(NR==1)max=min=$1;if(max<$1)max=$1;if(min>$1)min=$1;printf $1"("NR"), "}END{
v*=100
;print "\nv="v", max="max", min="min;for(n=1;n<=NR;n++)x(v,n);print "got total:"cnt}' FILE
4311(1), 5627(2), 8800(3), 722(4), 477(5), 3859(6), 9509(7), 6404(8), 6661(9), 5499(10), 5477(11), 3483(12), 323(13), 475(14), 8026(15), 1290(16), 7726(17), 2817(18), 7801(19), 6887(20), 8395(21), 1229(22), 7908(23),
v=27532, max=9509, min=323
27532=4311(1)+6404(8)+1290(16)+7726(17)+7801(19)
...
27532=477(5)+3859(6)+9509(7)+3483(12)+323(13)+475(14)+1290(16)+6887(20)+1229(22)
got total:42
real 0m2.960s
user 0m1.544s
sys 0m0.096s
It can be solved with small error
$ time awk -vv=275.32 'function abs(x){return(x>0?x:-x)}function x(v,s,c,t,p,y){if(t>v)return;if(s-c>1)while(++p<=NR-s+c)x(v,s,c+1,t+a[p],p,y a[p]"("p")+");else{if(t+max<v||v<t+min)return;while(++p<=NR){if(
abs(v-t-a[p])<10^-6
){cnt++;print v"="y a[p]"("p")"}}}}{a[NR]=$1;N=NR;if(NR==1)max=min=$1;if(max<$1)max=$1;if(min>$1)min=$1;printf $1"("NR"), "}END{print "\nmax="max", min="min;for(n=1;n<=NR;n++)x(v,n);print "got total:"cnt}' FILE
43.11(1), 56.27(2), 88(3), 7.22(4), 4.77(5), 38.59(6), 95.09(7), 64.04(8), 66.61(9), 54.99(10), 54.77(11), 34.83(12), 3.23(13), 4.75(14), 80.26(15), 12.9(16), 77.26(17), 28.17(18), 78.01(19), 68.87(20), 83.95(21), 12.29(22), 79.08(23),
max=95.09, min=3.23
275.32=43.11(1)+64.04(8)+12.9(16)+77.26(17)+78.01(19)
...
275.32=4.77(5)+38.59(6)+95.09(7)+34.83(12)+3.23(13)+4.75(14)+12.9(16)+68.87(20)+12.29(22)
got total:42
real 0m3.440s
user 0m1.780s
sys 0m0.108s
作者:
reyleon
時間:
2015-03-03 16:52
回復(fù)
24#
jason680
對你的敬仰猶如滔滔井水連綿不絕又如黃河泛濫一發(fā)不可收拾
作者:
reyleon
時間:
2015-03-03 16:54
回復(fù)
24#
jason680
有人想問你, 你的職業(yè)是與 IT 相關(guān)的么?
作者:
54nwq
時間:
2015-03-03 17:01
回復(fù)
25#
reyleon
確實(shí)是大牛啊,佩服,我理解不了
作者:
zsszss0000
時間:
2015-03-03 17:04
估計可能不相關(guān),不然怎么這么牛逼呢?
回復(fù)
26#
reyleon
作者:
刺客阿地
時間:
2015-03-03 17:05
很好奇,坐等jason680大神分享職業(yè)。。
作者:
刺客阿地
時間:
2015-03-03 17:05
很好奇,坐等jason680大神分享職業(yè)。。
作者:
jason680
時間:
2015-03-03 17:08
回復(fù)
26#
reyleon
I just like to programming and develop the test program many years.
作者:
jokimina
時間:
2015-03-03 17:09
。。路過同等
作者:
stupid_lee
時間:
2015-03-03 17:36
看了jason大神的回帖,都不敢在論壇說話了
作者:
zsszss0000
時間:
2015-03-03 18:46
本帖最后由 zsszss0000 于 2015-03-03 18:49 編輯
受6樓啟發(fā)
#include<iostream>
#include<fstream>
#include<vector>
#include <cmath>
using namespace std;
int main()
{
vector<float> mydata;
vector<int> alph;
float a=0;
float sum=0;
int i;
int k;
vector<float>::iterator di;///<mydata迭代器
vector<int>::iterator ai;///<alph迭代器
ifstream infile("save.txt");
while(infile>>a)
{
/*填充vector*/
mydata.push_back(a);
alph.push_back(0);
}
int num=mydata.size();
cout<<"the num of data is "<<num<<endl;
cout<<"the num of alph is "<<alph.size()<<endl;
for(di=mydata.begin();di!=mydata.end();di++)
{
cout<<*di<<endl;
}
for(ai=alph.begin();ai!=alph.end();ai++)
{
cout<<*ai<<endl;
}
for(k=0;k<pow(2,num);k++)
{
for(i=0,ai=alph.begin();ai!=alph.end();ai++,i++)
{
int kk=k/pow(2,i);
*ai=kk%2;
}
sum=0;
for(di=mydata.begin(),ai=alph.begin();ai!=alph.end();ai++,di++)
{
sum+=(*ai)*(*di);
}
cout<<"sum is "<<sum<<endl;
if(abs(sum-275.32)<0.001)
{
cout<<"got one:";
cout<<"the sum is "<<sum;
for(ai=alph.begin(),di=mydata.begin();ai!=alph.end();ai++,di++)
{
if((*ai)==1)
{
cout<<(*di)<<" ";
}
}
cout<<endl;
}
}
}
復(fù)制代碼
閑的慌,用C++實(shí)現(xiàn)了下,思路是遍歷,效率比較低。
最終得到的結(jié)果是:
1 got one:the sum is 275.3243.11 38.59 64.04 66.61 54.99 3.23 4.75
2 got one:the sum is 275.3288 7.22 95.09 4.75 80.26
3 got one:the sum is 275.327.22 38.59 64.04 54.99 54.77 34.83 3.23 4.75 12.9
4 got one:the sum is 275.3256.27 88 7.22 38.59 3.23 4.75 77.26
5 got one:the sum is 275.3256.27 88 4.77 38.59 54.77 4.75 28.17
6 got one:the sum is 275.3243.11 64.04 54.99 4.75 80.26 28.17
7 got one:the sum is 275.3243.11 7.22 4.77 38.59 64.04 34.83 4.75 78.01
8 got one:the sum is 275.3243.11 56.27 4.77 80.26 12.9 78.01
9 got one:the sum is 275.3243.11 64.04 12.9 77.26 78.01
10 got one:the sum is 275.3243.11 7.22 64.04 54.77 28.17 78.01
11 got one:the sum is 275.3256.27 88 7.22 4.75 12.9 28.17 78.01
12 got one:the sum is 275.3288 7.22 38.59 54.99 4.75 12.9 68.87
13 got one:the sum is 275.3238.59 64.04 54.77 3.23 4.75 12.9 28.17 68.87
14 got one:the sum is 275.327.22 54.99 34.83 3.23 28.17 78.01 68.87
15 got one:the sum is 275.3238.59 66.61 54.77 3.23 28.17 83.95
16 got one:the sum is 275.324.77 38.59 34.83 4.75 80.26 28.17 83.95
17 got one:the sum is 275.3243.11 4.77 34.83 3.23 77.26 28.17 83.95
18 got one:the sum is 275.3256.27 34.83 3.23 28.17 68.87 83.95
19 got one:the sum is 275.3243.11 56.27 7.22 66.61 54.99 34.83 12.29
20 got one:the sum is 275.3243.11 95.09 66.61 54.99 3.23 12.29
21 got one:the sum is 275.3256.27 7.22 4.77 54.99 54.77 4.75 80.26 12.29
22 got one:the sum is 275.3256.27 88 38.59 64.04 3.23 12.9 12.29
23 got one:the sum is 275.327.22 95.09 54.99 54.77 34.83 3.23 12.9 12.29
24 got one:the sum is 275.3243.11 56.27 88 54.77 3.23 4.75 12.9 12.29
25 got one:the sum is 275.327.22 64.04 54.99 54.77 4.75 77.26 12.29
26 got one:the sum is 275.3256.27 38.59 54.99 4.75 80.26 28.17 12.29
27 got one:the sum is 275.3243.11 56.27 54.99 3.23 77.26 28.17 12.29
28 got one:the sum is 275.3243.11 7.22 4.77 54.77 34.83 12.9 77.26 28.17 12.29
29 got one:the sum is 275.3243.11 7.22 4.77 95.09 34.83 78.01 12.29
30 got one:the sum is 275.3256.27 38.59 12.9 77.26 78.01 12.29
31 got one:the sum is 275.3256.27 7.22 38.59 54.77 28.17 78.01 12.29
32 got one:the sum is 275.324.77 38.59 95.09 34.83 3.23 4.75 12.9 68.87 12.29
33 got one:the sum is 275.3243.11 56.27 66.61 28.17 68.87 12.29
34 got one:the sum is 275.3256.27 7.22 54.77 34.83 12.9 28.17 68.87 12.29
35 got one:the sum is 275.3295.09 54.77 3.23 12.9 28.17 68.87 12.29
36 got one:the sum is 275.3243.11 34.83 3.23 4.75 80.26 12.9 83.95 12.29
37 got one:the sum is 275.3243.11 7.22 38.59 12.9 77.26 83.95 12.29
38 got one:the sum is 275.3243.11 54.99 3.23 4.75 12.9 77.26 79.08
39 got one:the sum is 275.327.22 38.59 64.04 54.99 3.23 28.17 79.08
40 got one:the sum is 275.3243.11 7.22 54.99 54.77 3.23 4.75 28.17 79.08
41 got one:the sum is 275.327.22 38.59 54.77 4.75 12.9 78.01 79.08
42 got one:the sum is 275.3243.11 66.61 4.75 12.9 68.87 79.08
復(fù)制代碼
作者:
Herowinter
時間:
2015-03-03 19:18
回復(fù)
1#
54nwq
感覺是個背包問題?
我算法沒學(xué)好啊...不會高效的...
作者:
reb00t
時間:
2015-03-04 13:16
本帖最后由 reb00t 于 2015-03-04 21:54 編輯
此題可以來個python版本~
#!/usr/bin/env python
import itertools
fname = "1"
data = []
VALUE = 275.32
t = 0
with open(fname) as fs:
for line in fs:
l = float(line.strip())
data.append(l)
for i in range(2,len(data)):
for m in itertools.combinations(data, i):
if str(sum(m))[:6] == str(VALUE):
t = t + 1
print data
print t
復(fù)制代碼
作者:
cao627
時間:
2015-03-08 17:34
@jason680
$ cat test
4
5
6
7
$ time awk -vv=18 'function x(v,s,c,t,p,y){if(t>v)return;if(s-c>1)while(++p<=NR-s+c)x(v,s,c+1,t+a[p],p,y a[p]"("p")+");else{while(++p<=NR){if(v==t+a[p]){cnt++;print v"="y a[p]"("p")"}}}}{a[NR]=$1;N=NR;if(NR==1)max=min=$1;if(max<$1)max=$1;if(min>$1)min=$1;printf $1"("NR"), "}END{print "\nv="v", max="max", min="min;for(n=2;n<=NR;n++)x(v,n);print "got total:"cnt}' test
4(1), 5(2), 6(3), 7(4),
v=18, max=7, min=4
got total:
real 0m0.004s
user 0m0.001s
sys 0m0.003s
$ time awk -vv=18 'function x(v,s,c,t,p,y){if(t>v)return;if(s-c>1)while(++p<=NR-s+c
+1
)x(v,s,c+1,t+a[p],p,y a[p]"("p")+");else{while(++p<=NR){if(v==t+a[p]){cnt++;print v"="y a[p]"("p")"}}}}{a[NR]=$1;N=NR;if(NR==1)max=min=$1;if(max<$1)max=$1;if(min>$1)min=$1;printf $1"("NR"), "}END{print "\nv="v", max="max", min="min;for(n=2;n<=NR;n++)x(v,n);print "got total:"cnt}' test
4(1), 5(2), 6(3), 7(4),
v=18, max=7, min=4
18=5(2)+6(3)+7(4)
got total:1
real 0m0.002s
user 0m0.002s
sys 0m0.000s
作者:
jason680
時間:
2015-03-09 11:16
回復(fù)
37#
cao627
thank you
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2