亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 求教用awk怎樣湊數(shù)字 [打印本頁]

作者: 54nwq    時間: 2015-03-02 15:11
標(biāo)題: 求教用awk怎樣湊數(shù)字
有如下一列文本
  1. 43.11
  2. 56.27
  3. 88
  4. 7.22
  5. 4.77
  6. 38.59
  7. 95.09
  8. 64.04
  9. 66.61
  10. 54.99
  11. 54.77
  12. 34.83
  13. 3.23
  14. 4.75
  15. 80.26
  16. 12.9
  17. 77.26
  18. 28.17
  19. 78.01
  20. 68.87
  21. 83.95
  22. 12.29
  23. 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
  1. 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 編輯
  1. a[i]*b[i]對這個進(jìn)行求和。
  2. a[i]是文件中的數(shù)字
  3. 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 -vv=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    0m3.029s
user    0m1.720s
sys    0m0.068s

real    0m3.123s
user    0m1.820s
sys    0m0.124s

real    0m2.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é)果就不一樣了
  1. sort -n test | awk ... test

  2. ....

  3. 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. 1:  95.09+88+80.26+7.22+4.75
  2. 2:  95.09+78.01+43.11+34.83+12.29+7.22+4.77
  3. 3:  95.09+68.87+54.77+28.17+12.9+12.29+3.23
  4. 4:  95.09+68.87+38.59+34.83+12.9+12.29+4.77+4.75+3.23
  5. 5:  95.09+66.61+54.99+43.11+12.29+3.23
  6. 6:  95.09+54.99+54.77+34.83+12.9+12.29+7.22+3.23
  7. 7:  88+78.01+56.27+28.17+12.9+7.22+4.75
  8. 8:  88+77.26+56.27+38.59+7.22+4.75+3.23
  9. 9:  88+68.87+54.99+38.59+12.9+7.22+4.75
  10. 10:  88+64.04+56.27+38.59+12.9+12.29+3.23
  11. 11:  88+56.27+54.77+43.11+12.9+12.29+4.75+3.23
  12. 12:  88+56.27+54.77+38.59+28.17+4.77+4.75
  13. 13:  83.95+80.26+43.11+34.83+12.9+12.29+4.75+3.23
  14. 14:  83.95+80.26+38.59+34.83+28.17+4.77+4.75
  15. 15:  83.95+77.26+43.11+38.59+12.9+12.29+7.22
  16. 16:  83.95+77.26+43.11+34.83+28.17+4.77+3.23
  17. 17:  83.95+68.87+56.27+34.83+28.17+3.23
  18. 18:  83.95+66.61+54.77+38.59+28.17+3.23
  19. 19:  80.26+78.01+56.27+43.11+12.9+4.77
  20. 20:  80.26+64.04+54.99+43.11+28.17+4.75
  21. 21:  80.26+56.27+54.99+54.77+12.29+7.22+4.77+4.75
  22. 22:  80.26+56.27+54.99+38.59+28.17+12.29+4.75
  23. 23:  79.08+78.01+54.77+38.59+12.9+7.22+4.75
  24. 24:  79.08+77.26+54.99+43.11+12.9+4.75+3.23
  25. 25:  79.08+68.87+66.61+43.11+12.9+4.75
  26. 26:  79.08+64.04+54.99+38.59+28.17+7.22+3.23
  27. 27:  79.08+54.99+54.77+43.11+28.17+7.22+4.75+3.23
  28. 28:  78.01+77.26+64.04+43.11+12.9
  29. 29:  78.01+77.26+56.27+38.59+12.9+12.29
  30. 30:  78.01+68.87+54.99+34.83+28.17+7.22+3.23
  31. 31:  78.01+64.04+54.77+43.11+28.17+7.22
  32. 32:  78.01+64.04+43.11+38.59+34.83+7.22+4.77+4.75
  33. 33:  78.01+56.27+54.77+38.59+28.17+12.29+7.22
  34. 34:  77.26+64.04+54.99+54.77+12.29+7.22+4.75
  35. 35:  77.26+56.27+54.99+43.11+28.17+12.29+3.23
  36. 36:  77.26+54.77+43.11+34.83+28.17+12.9+12.29+7.22+4.77
  37. 37:  68.87+66.61+56.27+43.11+28.17+12.29
  38. 38:  68.87+64.04+54.77+38.59+28.17+12.9+4.75+3.23
  39. 39:  68.87+56.27+54.77+34.83+28.17+12.9+12.29+7.22
  40. 40:  66.61+64.04+54.99+43.11+38.59+4.75+3.23
  41. 41:  66.61+56.27+54.99+43.11+34.83+12.29+7.22
  42. 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ā)
  1. #include<iostream>
  2. #include<fstream>
  3. #include<vector>
  4. #include <cmath>
  5. using namespace std;

  6. int main()
  7. {
  8.         vector<float> mydata;
  9.         vector<int>  alph;
  10.         float a=0;
  11.         float sum=0;
  12.         int i;
  13.         int k;
  14.         vector<float>::iterator di;///<mydata迭代器
  15.         vector<int>::iterator ai;///<alph迭代器
  16.         ifstream infile("save.txt");

  17.         while(infile>>a)
  18.         {
  19.                 /*填充vector*/
  20.                 mydata.push_back(a);
  21.                 alph.push_back(0);
  22.         }

  23.         int num=mydata.size();
  24.         cout<<"the num of data is "<<num<<endl;
  25.         cout<<"the num of alph is "<<alph.size()<<endl;

  26.         for(di=mydata.begin();di!=mydata.end();di++)
  27.         {
  28.                 cout<<*di<<endl;
  29.         }

  30.         for(ai=alph.begin();ai!=alph.end();ai++)
  31.         {
  32.                 cout<<*ai<<endl;
  33.         }
  34.         for(k=0;k<pow(2,num);k++)
  35.         {

  36.                 for(i=0,ai=alph.begin();ai!=alph.end();ai++,i++)
  37.                 {
  38.                         int kk=k/pow(2,i);
  39.                         *ai=kk%2;
  40.                 }
  41.                
  42.                 sum=0;
  43.                 for(di=mydata.begin(),ai=alph.begin();ai!=alph.end();ai++,di++)
  44.                 {
  45.                         sum+=(*ai)*(*di);
  46.                 }

  47.                 cout<<"sum is "<<sum<<endl;
  48.                 if(abs(sum-275.32)<0.001)
  49.                 {
  50.                         cout<<"got one:";
  51.                         cout<<"the sum is "<<sum;
  52.                        
  53.                         for(ai=alph.begin(),di=mydata.begin();ai!=alph.end();ai++,di++)
  54.                         {
  55.                                 if((*ai)==1)
  56.                                 {
  57.                                         cout<<(*di)<<"  ";
  58.                                 }
  59.                         }
  60.                         cout<<endl;
  61.                 }
  62.         }
  63. }
復(fù)制代碼
閑的慌,用C++實(shí)現(xiàn)了下,思路是遍歷,效率比較低。

最終得到的結(jié)果是:
  1.   1 got one:the sum is 275.3243.11  38.59  64.04  66.61  54.99  3.23  4.75                                                                     
  2.   2 got one:the sum is 275.3288  7.22  95.09  4.75  80.26
  3.   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.   4 got one:the sum is 275.3256.27  88  7.22  38.59  3.23  4.75  77.26
  5.   5 got one:the sum is 275.3256.27  88  4.77  38.59  54.77  4.75  28.17
  6.   6 got one:the sum is 275.3243.11  64.04  54.99  4.75  80.26  28.17
  7.   7 got one:the sum is 275.3243.11  7.22  4.77  38.59  64.04  34.83  4.75  78.01
  8.   8 got one:the sum is 275.3243.11  56.27  4.77  80.26  12.9  78.01
  9.   9 got one:the sum is 275.3243.11  64.04  12.9  77.26  78.01
  10. 10 got one:the sum is 275.3243.11  7.22  64.04  54.77  28.17  78.01
  11. 11 got one:the sum is 275.3256.27  88  7.22  4.75  12.9  28.17  78.01
  12. 12 got one:the sum is 275.3288  7.22  38.59  54.99  4.75  12.9  68.87
  13. 13 got one:the sum is 275.3238.59  64.04  54.77  3.23  4.75  12.9  28.17  68.87
  14. 14 got one:the sum is 275.327.22  54.99  34.83  3.23  28.17  78.01  68.87
  15. 15 got one:the sum is 275.3238.59  66.61  54.77  3.23  28.17  83.95
  16. 16 got one:the sum is 275.324.77  38.59  34.83  4.75  80.26  28.17  83.95
  17. 17 got one:the sum is 275.3243.11  4.77  34.83  3.23  77.26  28.17  83.95
  18. 18 got one:the sum is 275.3256.27  34.83  3.23  28.17  68.87  83.95
  19. 19 got one:the sum is 275.3243.11  56.27  7.22  66.61  54.99  34.83  12.29
  20. 20 got one:the sum is 275.3243.11  95.09  66.61  54.99  3.23  12.29
  21. 21 got one:the sum is 275.3256.27  7.22  4.77  54.99  54.77  4.75  80.26  12.29
  22. 22 got one:the sum is 275.3256.27  88  38.59  64.04  3.23  12.9  12.29
  23. 23 got one:the sum is 275.327.22  95.09  54.99  54.77  34.83  3.23  12.9  12.29
  24. 24 got one:the sum is 275.3243.11  56.27  88  54.77  3.23  4.75  12.9  12.29
  25. 25 got one:the sum is 275.327.22  64.04  54.99  54.77  4.75  77.26  12.29
  26. 26 got one:the sum is 275.3256.27  38.59  54.99  4.75  80.26  28.17  12.29
  27. 27 got one:the sum is 275.3243.11  56.27  54.99  3.23  77.26  28.17  12.29
  28. 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. 29 got one:the sum is 275.3243.11  7.22  4.77  95.09  34.83  78.01  12.29
  30. 30 got one:the sum is 275.3256.27  38.59  12.9  77.26  78.01  12.29
  31. 31 got one:the sum is 275.3256.27  7.22  38.59  54.77  28.17  78.01  12.29
  32. 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. 33 got one:the sum is 275.3243.11  56.27  66.61  28.17  68.87  12.29
  34. 34 got one:the sum is 275.3256.27  7.22  54.77  34.83  12.9  28.17  68.87  12.29
  35. 35 got one:the sum is 275.3295.09  54.77  3.23  12.9  28.17  68.87  12.29
  36. 36 got one:the sum is 275.3243.11  34.83  3.23  4.75  80.26  12.9  83.95  12.29
  37. 37 got one:the sum is 275.3243.11  7.22  38.59  12.9  77.26  83.95  12.29
  38. 38 got one:the sum is 275.3243.11  54.99  3.23  4.75  12.9  77.26  79.08
  39. 39 got one:the sum is 275.327.22  38.59  64.04  54.99  3.23  28.17  79.08
  40. 40 got one:the sum is 275.3243.11  7.22  54.99  54.77  3.23  4.75  28.17  79.08
  41. 41 got one:the sum is 275.327.22  38.59  54.77  4.75  12.9  78.01  79.08
  42. 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版本~
  1. #!/usr/bin/env  python
  2. import itertools

  3. fname = "1"
  4. data = []
  5. VALUE = 275.32
  6. t = 0


  7. with open(fname) as fs:
  8.         for line in fs:
  9.             l = float(line.strip())
  10.             data.append(l)

  11. for i in range(2,len(data)):
  12.     for m in itertools.combinations(data, i):
  13.         if str(sum(m))[:6] == str(VALUE):
  14.             t = t + 1
  15.             print  data

  16. 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