討論區快速選單
知識庫快速選單
最紅的App開發語言:Kotlin 想要資料分析就學Python 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
陣列任取某些數值做加總
更改我的閱讀文章字型大小
作者 : mjh0304(mark)
[ 貼文 2 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/8/29 下午 03:50:15
陣列[2,3,7,11]
請問大家要如何從陣列中任取2個,任取3個的所有加總組合
例:2+3,2+7
2+3+11,2+7+11
謝謝
作者 : gmailjoey(建中) 貼文超過200則
[ 貼文 206 | 人氣 0 | 評價 190 | 評價/貼文 0.92 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/8/30 上午 12:42:13
PHP我沒學過,不過論壇有VC++的程式碼。
前年Cxxlman大大曾經做出計算組合數字的程式碼,
今天晚上我把2005版的Visual C++碼進行了修改,
初步排列出所有組合出來。
請你參考看看,能不能照著這種寫法將它改成PHP程式碼。

// stdafx.h : 可在此標頭檔中包含標準的系統 Include 檔,
// 或是經常使用卻很少變更的
// 專案專用 Include 檔案
//

#pragma once

#ifndef _WIN32_WINNT // 允許使用 Windows XP (含) 以後版本的特定功能。
#define _WIN32_WINNT 0x0501 // 將它變更為針對 Windows 其他版本的適當值。
#endif

#include <stdio.h>
#include <tchar.h>



// TODO: 在此參考您的程式所需要的其他標頭
//---------檔案到此為止
//-----------------------------------------------------------------------------------------------------------------------------
// Cnr003.cpp : 定義主控台應用程式的進入點。
//下面是主程式的程式碼。



#include "stdafx.h"
#include <stdio.h>

#include <vector>
#include <iostream>
#include <iomanip>


#define ANUMBER 4
#define BNUMBER 3
#define CNUMBER 2
#define MNUMBER 1

#define SLOT1 "2"
#define SLOT2 "3"
#define SLOT3 "7"
#define SLOT4 "11"


template <typename T>
std::ostream& operator <<(std::ostream& os, std::vector<T>& vt)
{
  os << "{ ";
  for(std::vector<T>::iterator cit = vt.begin();
     cit != vt.end();
     ++cit)
  {
if (*cit == 1){os << SLOT1 << ' ';}
if (*cit == 2){os << SLOT2 << ' ';}
if (*cit == 3){os << SLOT3 << ' ';}
if (*cit == 4){os << SLOT4 << ' ';}

  }
  os << "}";
  return os;
}

void Combination(const size_t n, const size_t r,
     void (*pFn)(std::vector<size_t>& vt))
{
  if(n == 0 || n < r) return;

  std::vector<size_t> result(r);
  bool up = true;
  size_t Level = 0;

  while(Level < r)
  {
    result[Level] = Level + 1;
    ++Level;
  }

  size_t b = n-r+1;
  while(true)
  {
    if(Level == r)
    {
     pFn(result);

--Level;
     up = false;
    }
    else if(Level == 0)
    {
     if(up == false)
     {
     if(result[0] < b)
     {
     up = true;
     ++result[0];
     ++Level;
     }
     else
     return;
     }
    }
    else
    {
     if(up == false)
     {
     if(result[Level] < (b+Level))
     {
     up = true;
     ++result[Level];
     ++Level;
     }
     else
     --Level;
     }
     else // if(up == true)
     {
     result[Level] = result[Level-1]+1;
     ++Level;
     }
    }
  }
}






unsigned long long m = MNUMBER;

// 回叫函數
void Fn(std::vector<size_t>& result)
{
  std::cout << std::setw(10) << m++ << ": " <<result << std::endl;

}



int main(int argc, char* argv[])
{
     size_t n, r;

n = ANUMBER;
     r = CNUMBER;
m = 1;
     Combination(n, r, Fn);
std::cout<<"---------------------------------------"<<std::endl;

m = MNUMBER;
     r = BNUMBER;
Combination(n, r, Fn);

system("PAUSE");

  return 0;
}
作者 : gmailjoey(建中) 貼文超過200則
[ 貼文 206 | 人氣 0 | 評價 190 | 評價/貼文 0.92 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/8/30 下午 12:42:07

我今天看了一下昨晚的程式碼,
發現重寫<<運算子,
會帶來很多副作用到C++系統裡面。
所以上一篇我的程式碼僅供參考,
不推薦實作,
希望有高手能提出更好用的PHP程式碼。

延伸閱讀:

下面是這幾年研究排列組合的討論串的網址,
資料量龐大,不必緊張,
請有興趣的網友拷貝貼上研究看看哦!
有多餘的時間再參考看看就可以了。


自動號碼產生器的討論串:
這是排列組合的主要討論串。

http://www.programmer-club.com.tw/ShowSameTitleN/c/46015.html

Cxxlman大大的排列組合程式碼網址:
內容豐富,感謝分享!

http://blog.cxxl3d.tk/2015/03/blog-post.html

我的排列產生器網址:

原始網址:
http://joeymovieyoutube.blogspot.tw/2014/11/visual-c-2005auto-number-
generator.html

作者 : gmailjoey(建中) 貼文超過200則
[ 貼文 206 | 人氣 0 | 評價 190 | 評價/貼文 0.92 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/9/5 下午 08:49:56
過了一個禮拜了,都沒有人提出PHP程式碼。
那今天我來補充說明一下筆者改寫的部分。

筆者的程式來自CxxlMan的排列組合計算程式網址:
http://blog.cxxl3d.tk/2015/03/blog-post.html

筆者引用的是2005版Visual C++/Visual Studio的程式碼。
這個程式利用改寫<<運算子的方式,
排出C(n,r)的所有組合。
因為使用了STL標準函式庫,
所以改寫很困難,功能也很陽春。
提問者要求寫出[2,3,7,11]的任選二組任選三組的組合,
所以筆者首先使用#define敘述和 if敘述來改寫變數,
未來將可以把這些變數放進class、
struct或是namespace當中。

首先來看定義的數字:

#define ANUMBER 4
#define BNUMBER 3
#define CNUMBER 2
#define MNUMBER 1

上面這四行的意義是:
ANUMBER = 4
BNUMBER = 3
CNUMBER = 2
MNUMBER = 1

接下來的程式碼:
#define SLOT1 "2"
#define SLOT2 "3"
#define SLOT3 "7"
#define SLOT4 "11"

SLOT1 到SLOT4是用來顯示提問者的陣列[2,3,7,11]
剛好分成四個字串來顯示。

> template <typename T>
> std::ostream& operator <<(std::ostream& os, std::vector<T>& vt)
> {
> os << "{ ";
> for(std::vector<T>::iterator cit = vt.begin();
> cit != vt.end();
> ++cit)
> {
> if (*cit == 1){os << SLOT1 << ' ';}
> if (*cit == 2){os << SLOT2 << ' ';}
> if (*cit == 3){os << SLOT3 << ' ';}
> if (*cit == 4){os << SLOT4 << ' ';}
> ...

因為陣列內元素數量ANUMBER = 4
所以下面增加的if敘述只寫了四行,
加入了SLOT1到SLOT4的顯示,
就可以順利的排出[2,3,7,11]數字組合出來。
未來進一步的改寫是可以寫成巢狀if敘述。
或是if敘述改寫成函數呼叫。


通常寫大型程式是不建議更改<<運算子,
以免電腦字串當中跑出提問者的數字2.3.7.11,
這裡是為了說明VC++2005的舊的小型程式碼,
所以才改寫了<<運算子。


至於CxxlMan主要的函數

void Combination(const size_t n, const size_t r,
     void (*pFn)(std::vector<size_t>& vt))
{...}

筆者就完全沒有修改它了。
CxxlMan能寫出這麼複雜的計算,
真是令人敬佩啊。

最後是主程式。以下是主程式的註解。
int main(int argc, char* argv[])
{

     size_t n, r;

     n = ANUMBER; //n值用ANUMBER代入
     r = CNUMBER; //r值用CNUMBER代入
     m = 1; //m值用1代入
     Combination(n, r, Fn); //跑第一次Combination()函數
std::cout<<"---------------------------------------"<<std::endl; //畫一條分隔線

     m = MNUMBER; //m值已改變,所以m值用MNUMBER代入
     r = BNUMBER; //r值用BNUMBER代入
     Combination(n, r, Fn); //跑第二次Combination()函數

system("PAUSE"); //等使用者按下任意鍵結束

  return 0;
}

至於沒有完成的部分:
如果要加總[2,3,7,11]這些數字的某些組合,
可以在改寫<<運算子的敘述裡面修改,
另外定義int[]來計算。
可是顯示int[]就必須修改Fn()函數。

Fn()函數如果加入輸入中文敘述的話,
個人是覺得程式碼會超過2000字的限制,
所以筆者就不貼程式碼了,
有興趣的網友可以來修改看看,
有多餘的時間可以來修改看看。




作者 : turing(Alan)
[ 貼文 68 | 人氣 0 | 評價 300 | 評價/貼文 4.41 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/9/18 下午 07:30:36
也許是

function partial_sum($A, $K)
{
    return array_sum(array_intersect_key($A, array_flip($K)));
}
 板主 : 酷爸爸
 > PHP - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - PHP - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
PHP
1 Fillano 1400 
2 dreamer...... 1170 
3 阿文 940 
4 路人乙 840 
5 pangpang 620 
6 kiang 580 
7 Snaking 470 
8 Aery 460 
9 kagaya 370 
10 mygod 370 
PHP
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
5.859375E-02