C# N个数组相乘

低调的感觉 2014-09-17 05:19:21
有N个数组,现在存在一个变量里:

var dics = new Dictionary<string, decimal[]>();
dics.Add("001",new[] {1, 1.5, 1.2});
dics.Add("002",new[] {2, 2.5, 2.2});
dics.Add("003",new[] {3, 3.5, 3.2});
......

现在需要得到:
"1 * 2 * 3 = 6",
"1 * 2 * 3.5 = xx",
"1 * 2 * 3.2 = xx",
"1.5 * 2 * 3 = xx",
"1.5 * 2 * 3.5 = xx",
"1.5 * 2 * 3.2 = xx",
"1.2 * 2 * 3 = xx",
"1.2 * 2 * 3.5 = xx",
"1.2 * 2 * 3.2 = xx",

就是数组里的数据相乘,不知有什么实现的方法? 如果需要用到递归,请问这个递归怎么写?
...全文
697 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
低调的感觉 2014-09-22
  • 打赏
  • 举报
回复
问题未解决,请求帮助!
gxingmin 2014-09-22
  • 打赏
  • 举报
回复
12楼代码是将所有数组相乘,这个楼主明白否? 你现在的需求是不一定全部相乘,而是传入参数进来,现在假设这个参数是n,你将dics里的元素n组合(如n=2就是两两组合,n=3就是三三组合,这个算法应该不难吧。。。)然后将这些组合里的元素全部相乘(参考12楼代码)
於黾 2014-09-18
  • 打赏
  • 举报
回复
数组数量不确定,数组长度不确定, 没关系啊. 用1楼的方法先递归,遍历出结果 然后结果再遍历,重新组合
Satroki 2014-09-18
  • 打赏
  • 举报
回复
引用 6 楼 loveyang7733 的回复:
数组数量不确定,而且组合的方式也不确定,可能每两个数组成一组,也可能每三个数组成一组
当有N个长度3的数组,输入参数m以后,应该输出多少个结果?把乘的规则说清楚吧……
romanchaos 2014-09-18
  • 打赏
  • 举报
回复
数组数量不明确数组里的元素数量也不明确是这个意思么?假如第一个数组有4个第二个数组只有3个,那么第一个数组的第四个元素乘以几?
低调的感觉 2014-09-18
  • 打赏
  • 举报
回复
引用 5 楼 xyl2902 的回复:
            var result = from a in arr1
                         from b in arr2
                         from c in arr3
                         select String.Format("{0}*{1}*{2} = {3}", a, b, c, a * b * c);
如果确定数组数量我就这么写了……
数组数量不确定,而且组合的方式也不确定,可能每两个数组成一组,也可能每三个数组成一组
Satroki 2014-09-18
  • 打赏
  • 举报
回复
            var result = from a in arr1
                         from b in arr2
                         from c in arr3
                         select String.Format("{0}*{1}*{2} = {3}", a, b, c, a * b * c);
如果确定数组数量我就这么写了……
低调的感觉 2014-09-18
  • 打赏
  • 举报
回复
引用 3 楼 gxingmin 的回复:
规则列出来,你的例子结果没列全吧 是不是数组中的元素除了跟自己所在的数组中的元素不相乘外,都要和其他数组的每个元素都要乘一遍?
是的! 我的问题没有说全,还需要传一个参数,以上结果是传“3”的结果,就是每3个数组成一条记录,如果传“2”,就是没2条记录组成一条语句: "1 * 2 = 2", "1 * 3.5 = xx", "1 * 3.2 = xx", "1 * 3 = xx", "1 * 3.5 = xx", "1 * 3.2 = xx", "1.5 * 2 = xx", "1.5 * 2.5 = xx", "1.5 * 2.2 = xx", "1.5 * 3 = xx", "1.5 * 3.5 = xx", "1.5 * 3.2 = xx", "1.2 * 2 = xx", "1.2 * 2.5 = xx", "1.2 * 2.2 = xx", "1.2 * 3 = xx", "1.2 * 3.5 = xx", "1.2 * 3.2 = xx",
低调的感觉 2014-09-18
  • 打赏
  • 举报
回复
        private void Load()
        {
            var dics = new Dictionary<string, decimal[]>();
            dics.Add("x001", new[] { 1m });
            dics.Add("x002", new[] { 2, 2.5m, 2.2m });
            dics.Add("x003", new[] { 3, 3.2m });
            //...

            /*
             * 参数1:dics 是变量,格式就是<string, decimal[]>,每条数据里面的 decimal[] 是动态的
             * 参数2:combination 是变量,意思:M串1(2:表示任意两个数相乘;3:表示任意三个数相乘;4:表示任意四个数相乘;同一数组里面的数不相乘)
             * 
             * 结果:
             * 
             GetHtml(dics, 2)
             * 
             a001[1]*a002[2]=2;
             a001[1]*a002[2.5]=xx;
             a001[1]*a002[2.2]=xx;
             a001[1]*a003[3]=xx;
             a001[1]*a003[3.2]=xx;
             a002[2]*a003[3]=2;
             a002[2]*a003[3.2]=xx;
             a002[2.5]*a003[3]=2;
             a002[2.5]*a003[3.2]=xx;
             a002[2.2]*a003[3]=2;
             a002[2.2]*a003[3.2]=xx;
             * 
             GetHtml(dics, 3)
             * 
             a001[1]*a002[2]*a003[3]=xx;
             a001[1]*a002[2.5]*a003[3]=xx;
             a001[1]*a002[2.2]*a003[3]=xx;
             a001[1]*a002[2]*a003[3.2]=xx;
             a001[1]*a002[2.5]*a003[3.2]=xx;
             a001[1]*a002[2.2]*a003[3.2]=xx;
            */
        }

        private void GetHtml(Dictionary<string, decimal[]> dics, int combination)
        {
            //...
        }
* 参数1:dics 是变量,格式就是<string, decimal[]>,每条数据里面的 decimal[] 是动态的 * 参数2:combination 是变量,意思:M串1(2:表示任意两个数相乘;3:表示任意三个数相乘;4:表示任意四个数相乘;同一数组里面的数不相乘)
低调的感觉 2014-09-18
  • 打赏
  • 举报
回复
非常感谢大家的回复
gxingmin 2014-09-18
  • 打赏
  • 举报
回复
引用 10 楼 gxingmin 的回复:
试试这个,
var dics = new Dictionary<string, decimal[]>();
            dics.Add("001", new [] { 1, 1.5m, 1.2m });
            dics.Add("002", new [] { 2, 2.5m, 2.2m });
            dics.Add("003", new [] { 3, 3.5m, 3.2m });
            //...数组可以无限多

            var a = dics["001"].ToList();
            int i = 0;
            foreach (var b in dics.Values)
            {
                if (i > 0)
                {
                    a = (from x in a
                         from y in b
                         select x * y).ToList();
                }

               i++;

            }
//输出结果
           i = 0;
            foreach (var x in a)
            {
                Console.Write(string.Format("{0}",x.ToString().PadLeft(10)));
                i++;
                if (i % 3 == 0)
                    Console.WriteLine();
            
            }

           6       7.0       6.4
       7.5      8.75      8.00
       6.6      7.70      7.04
       9.0     10.50      9.60
     11.25    13.125    12.000
      9.90    11.550    10.560
       7.2      8.40      7.68
      9.00    10.500     9.600
      7.92     9.240     8.448
gxingmin 2014-09-18
  • 打赏
  • 举报
回复
a是最终结果
gxingmin 2014-09-18
  • 打赏
  • 举报
回复
试试这个,
var dics = new Dictionary<string, decimal[]>();
            dics.Add("001", new [] { 1, 1.5m, 1.2m });
            dics.Add("002", new [] { 2, 2.5m, 2.2m });
            dics.Add("003", new [] { 3, 3.5m, 3.2m });
            //...数组可以无限多

            var a = dics["001"].ToList();
            int i = 0;
            foreach (var b in dics.Values)
            {
                if (i > 0)
                {
                    a = (from x in a
                         from y in b
                         select x * y).ToList();
                }

               i++;

            }
gxingmin 2014-09-17
  • 打赏
  • 举报
回复
规则列出来,你的例子结果没列全吧 是不是数组中的元素除了跟自己所在的数组中的元素不相乘外,都要和其他数组的每个元素都要乘一遍?
xdashewan 2014-09-17
  • 打赏
  • 举报
回复

            double[] a3 = { 1, 2 };
            double[] b3 = { 3, 4 };
            double[] result = a3.Zip(b3, (x, y) => x * y).ToArray();
一组组数据乘下去
於黾 2014-09-17
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390884211 这是N个数组,获取所有排列组合的结果 然后你循环结果,把里面每一项相乘就行了
包含矩阵定义,矩阵输出,矩阵格式化输出,矩阵转置,矩阵相加,矩阵相乘,N阶方阵行列式求值,求逆,求伴随矩阵,求上三角形 命名空间:matrix 定义类:Matrix 方法: public Matrix(int mm, int nn) 定义矩阵A: Matrix A=new Matrix(int mm, int nn); public double read(int i, int j) 获取Aij: A.read(i,j); public int write(int i, int j, double val) 将数据b写入Aij: A.read(i,j,b); 释放矩阵: public void freeMatrix() A.freeMatrix(); 方法: //C = A + B //成功返回1,失败返回-1 public int add(ref Matrix A, ref Matrix B, ref Matrix C) //C = A - B //成功返回1,失败返回-1 public int subtract(ref Matrix A, ref Matrix B, ref Matrix C) //C = A * B //成功返回1,失败返回-1 public int multiply(ref Matrix A, ref Matrix B, ref Matrix C) //行列式的值,只能计算2 * 2,3 * 3 //失败返回-31415,成功返回值 public double det(ref Matrix A) //求转置矩阵,B = AT //成功返回1,失败返回-1 public int transpos(ref Matrix A, ref Matrix B) //求逆矩阵,B = A^(-1) //成功返回1,失败返回-1 public int inverse(ref Matrix A, ref Matrix B) //矩阵输出// public string Out(ref Matrix A) //矩阵格式化输出// public string Outt(ref Matrix A, string format) //矩阵一维数组赋值// public void Fuzhi( ref Matrix A , double[] arr) //方阵行列式值// public double Det(ref Matrix A) //矩阵的伴随矩阵// public void Accompany(ref Matrix A, ref Matrix B) //伴随矩阵法求矩阵的逆// public void Inverse(ref Matrix A, ref Matrix B) //矩阵相等// public void Equal(ref Matrix A, ref Matrix B) //C = A + B //成功返回1,失败返回-1 A.add(ref Matrix A, ref Matrix B, ref Matrix C); //C = A - B //成功返回1,失败返回-1 A.subtract(ref Matrix A, ref Matrix B, ref Matrix C) //C = A * B //成功返回1,失败返回-1 A.multiply(ref Matrix A, ref Matrix B, ref Matrix C) //行列式的值,只能计算2 * 2,3 * 3 //失败返回-31415,成功返回值 A.det(ref Matrix A) //求转置矩阵,B = AT //成功返回1,失败返回-1 A.transpos(ref Matrix A, ref Matrix B) //求逆矩阵,B = A^(-1

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧