锻炼下,看谁能弄出来,C#编程技巧!

时间:2021-07-12 17:50:27
问:1 2 4 8 16
求 其中的任意一个数 和 其他的任意多个或者一个数的和 的所有值

比如 跟 1有关的一个或者多个数的和为:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
 跟2 4 6 8 16 的各是多少,

谁可以用编程做出来啊,呵呵,分全部给他,估计高手们一看便会啊!

24 个解决方案

#1


其实跟2有关的是:2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31

#2


没看明白,理解ing

#3


其实就是求包含某一个元素的组合方式有多少种,当然,要把和一样的过滤掉。

#4


没看懂题。。。。

#5


啊~~~明白了!!!看懂了看懂了

#6


引用楼主 srxljl 的回复:
问:1 2 4 8 16
求 其中的任意一个数 和 其他的任意多个或者一个数的和 的所有值

比如 跟 1有关的一个或者多个数的和为:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
 跟2 4 6 8 16 的各是多少,

谁可以用编程做出来啊,呵呵,分全部给他,估计高手们一看便会啊!

2 就是
1,2
2,4
1,2,4
2,8
1,2,8
2,4,8
1,2,4,8
2,16
1,2,16
2,4,16
2,8,16
1,2,4,16
1,2,8,16
2,4,8,16
这些每一行的值,就是2对应的那个数列,是这意思不?

#7


其实是考“位”概念的
随便写了个:
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x & iFix) == iFix).ToList<int>();
        }

        static void Main(string[] args)
        {
            Console.WriteLine("全部:");
            foreach (int value in GetValues(0))
            {
                Console.Write("{0} ", value);
            }
            Console.WriteLine();

            int[] fixes = new int[] { 1, 2, 4, 8, 16 };
            foreach (int fix in fixes)
            {
                Console.WriteLine("{0}相关:", fix);
                foreach (int value in GetValues(fix))
                {
                    Console.Write("{0} ", value);
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }

#8


var array = new int[]{1, 2, 4, 8, 16};
var seed = 1;          
for (int i = 0; i < array.Length; i++)
{
    if (array[i] == seed) continue;                
    for (int j = 0; j < array.Length ; j++)
    {                    
        if (array[j] == seed) continue;                
        Console.WriteLine(array.Skip(i).Take(j).Aggregate(seed, (a, b) => a + b));
    }
}


没有考虑去重复,Distinct()

#9


引用 7 楼 foreachif 的回复:
其实是考“位”概念的
随便写了个:
C# code
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x &amp; iFix) == iFix).ToList……

为啥我觉着是数学的排列组合啊。。。

#10


为啥堪称排列组合?别人却能理解成位的概念。这就是数学脑袋和计算机脑袋的区别。

#11


引用 10 楼 cnwin 的回复:
为啥堪称排列组合?别人却能理解成位的概念。这就是数学脑袋和计算机脑袋的区别。

额。。。我想的思路就是排列组合式的把结果全算出来,木有啥位的概念- -
感觉按排列组合也挺简单的,如果要顺序的话最后排个序就OK了

#12


利用数组即可实现

#13


引用 8 楼  的回复:
C# code


这个是错的,请无视,7#的思路很抢眼啊,呵呵

#14


引用 7 楼  的回复:
其实是考“位”概念的
随便写了个:
C# code
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x &amp; iFix) == iFix).ToList……


强大的linq.....

#15


引用 7 楼  的回复:
其实是考“位”概念的
随便写了个:
C# code
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x &amp; iFix) == iFix).ToList……


等一下验证一下,好像ok的

#16


00001
00010
00100
01000
10000

求的值为某一固定位的所有组合:
00001 00011 00101 00111 01001……
00010 00011 00110 00111 01010……

#17


引用 2 楼  的回复:
没看明白,理解ing

跟1有关的,就是 1身,还有1+2的和3跟1有关,就是说,如果你看到了3,就知道肯定含有1和2,如果看到4就知道,就是4本身,如果看到5就是 4+1得来的,毕竟其他数字怎么加都不等于5,如果看到6就知道肯定是4+2的来的,别的数字是加不出来6的,如果看到7就是1+2+4得来的,别的数字相加肯定不能得到这个结果,如果看到 8肯定就是8本身,以此类推,所有有可能和1组合的和的数字是:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31

#18


引用 6 楼  的回复:
引用楼主 srxljl 的回复:
问:1 2 4 8 16
求 其中的任意一个数 和 其他的任意多个或者一个数的和 的所有值

比如 跟 1有关的一个或者多个数的和为:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
跟2 4 6 8 16 的各是多少,

谁可以用编程做出来啊,呵呵,分全部给他,估计高手们一看便会啊!

2 就是
1,2
……

你说的不错,但是,还有2本身跟2也有关系,另外还少了 1,2,4,16 = 23 的这个,其实最后结果是 每个数字跟自己有关的,都是16种。

#19


该回复于2012-03-29 11:44:55被版主删除

#20


其实就是位运算的问题,1 2 4 8 16可以用5位二进制数来表示,可以表示1-31之间的数,去掉1 2 4 8 16这5个没有与其它数相加的数,就是剩下的26个数

#21


int print_group(void)
{
int i, j;
int ret[5][32];
int ret_long[5];
memset(ret_long, 0, sizeof(ret_long));
for(i=1; i<32; ++i)
{
if(i&0x1) {
ret[0][ret_long[0]++] = i;
}
if(i&0x2) {
ret[1][ret_long[1]++] = i;
}
if(i&0x4) {
ret[2][ret_long[2]++] = i;
}
if(i&0x8) {
ret[3][ret_long[3]++] = i;
}
if(i&0x10) {
ret[4][ret_long[4]++] = i;
}

}
for(i=0; i<5; ++i) {
for(j=0; j<ret_long[i]; ++j) {
printf("%2d, ", ret[i][j]);
}
printf("\n");
}
return 0;
}
C#忘光了,贴个C的。

#22


引用 21 楼  的回复:
C/C++ code
int print_group(void)
{
    int i, j;
    int ret[5][32];
    int ret_long[5];
    memset(ret_long, 0, sizeof(ret_long));
    for(i=1; i<32; ++i)
    {
        if(i&amp;0x1) {
           ……
其实ret[5][32]中的32为16就可以了,一个位要么为1要么为0,即这些数的和要么包含它要么不包含,那就各占一半。而1 2 4 8 16任意多个不重复个数相加的和都不会产生相同的数,那么就只有31个数了,取一半用16个正好。

#23


for(int i =0;i<5;i++)
            {
                for (int j = 0; j < 30; j++)
                {
                    Console.WriteLine(j + Math.Pow(2, i));
                    j = j + 1;
                    Console.WriteLine();
                }
            }
            Console.ReadLine();  你看看是不是你要的结果

#24


这是算法思想的题,与语言无关
一个集合集X运行算法F,得出另一个结果集Y
型如:f([x0,x1,...]) 输出集合[y1,y2.。。]
F([a1,a2])=>[a1a2]//设任意数为a2
F([a1,a2,a3])=>a3与[a1,a2]的历遍和,再历遍F([a1,a2])的和 //设任意数为a3
F([a1,a2,a3,a4])=>a4与[a1,a2,a3]的历遍和,再历遍F([a1,a2,a3])的和 //设任意数为a4
由此推导可以以数学的思路作题,如下:
设X = [A1...An],求F(X)的结果集Y,设任意数为Ax,其中F算法是上面要求的一样

先设临地集合tempArray=集合X移除元素Ax之后的集合;
则结果集Y = Ax历遍tempArray每个元素的和,再合并到F(tempArray)的结果集上

至于这个算法用啥语言实现都不重要,前提是这个算法思路没有错

#1


其实跟2有关的是:2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31

#2


没看明白,理解ing

#3


其实就是求包含某一个元素的组合方式有多少种,当然,要把和一样的过滤掉。

#4


没看懂题。。。。

#5


啊~~~明白了!!!看懂了看懂了

#6


引用楼主 srxljl 的回复:
问:1 2 4 8 16
求 其中的任意一个数 和 其他的任意多个或者一个数的和 的所有值

比如 跟 1有关的一个或者多个数的和为:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
 跟2 4 6 8 16 的各是多少,

谁可以用编程做出来啊,呵呵,分全部给他,估计高手们一看便会啊!

2 就是
1,2
2,4
1,2,4
2,8
1,2,8
2,4,8
1,2,4,8
2,16
1,2,16
2,4,16
2,8,16
1,2,4,16
1,2,8,16
2,4,8,16
这些每一行的值,就是2对应的那个数列,是这意思不?

#7


其实是考“位”概念的
随便写了个:
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x & iFix) == iFix).ToList<int>();
        }

        static void Main(string[] args)
        {
            Console.WriteLine("全部:");
            foreach (int value in GetValues(0))
            {
                Console.Write("{0} ", value);
            }
            Console.WriteLine();

            int[] fixes = new int[] { 1, 2, 4, 8, 16 };
            foreach (int fix in fixes)
            {
                Console.WriteLine("{0}相关:", fix);
                foreach (int value in GetValues(fix))
                {
                    Console.Write("{0} ", value);
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }

#8


var array = new int[]{1, 2, 4, 8, 16};
var seed = 1;          
for (int i = 0; i < array.Length; i++)
{
    if (array[i] == seed) continue;                
    for (int j = 0; j < array.Length ; j++)
    {                    
        if (array[j] == seed) continue;                
        Console.WriteLine(array.Skip(i).Take(j).Aggregate(seed, (a, b) => a + b));
    }
}


没有考虑去重复,Distinct()

#9


引用 7 楼 foreachif 的回复:
其实是考“位”概念的
随便写了个:
C# code
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x &amp; iFix) == iFix).ToList……

为啥我觉着是数学的排列组合啊。。。

#10


为啥堪称排列组合?别人却能理解成位的概念。这就是数学脑袋和计算机脑袋的区别。

#11


引用 10 楼 cnwin 的回复:
为啥堪称排列组合?别人却能理解成位的概念。这就是数学脑袋和计算机脑袋的区别。

额。。。我想的思路就是排列组合式的把结果全算出来,木有啥位的概念- -
感觉按排列组合也挺简单的,如果要顺序的话最后排个序就OK了

#12


利用数组即可实现

#13


引用 8 楼  的回复:
C# code


这个是错的,请无视,7#的思路很抢眼啊,呵呵

#14


引用 7 楼  的回复:
其实是考“位”概念的
随便写了个:
C# code
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x &amp; iFix) == iFix).ToList……


强大的linq.....

#15


引用 7 楼  的回复:
其实是考“位”概念的
随便写了个:
C# code
    class Program
    {
        public static List<int> GetValues(int iFix)
        {
            return Enumerable.Range(1, 31).Where(x => (x &amp; iFix) == iFix).ToList……


等一下验证一下,好像ok的

#16


00001
00010
00100
01000
10000

求的值为某一固定位的所有组合:
00001 00011 00101 00111 01001……
00010 00011 00110 00111 01010……

#17


引用 2 楼  的回复:
没看明白,理解ing

跟1有关的,就是 1身,还有1+2的和3跟1有关,就是说,如果你看到了3,就知道肯定含有1和2,如果看到4就知道,就是4本身,如果看到5就是 4+1得来的,毕竟其他数字怎么加都不等于5,如果看到6就知道肯定是4+2的来的,别的数字是加不出来6的,如果看到7就是1+2+4得来的,别的数字相加肯定不能得到这个结果,如果看到 8肯定就是8本身,以此类推,所有有可能和1组合的和的数字是:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31

#18


引用 6 楼  的回复:
引用楼主 srxljl 的回复:
问:1 2 4 8 16
求 其中的任意一个数 和 其他的任意多个或者一个数的和 的所有值

比如 跟 1有关的一个或者多个数的和为:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
跟2 4 6 8 16 的各是多少,

谁可以用编程做出来啊,呵呵,分全部给他,估计高手们一看便会啊!

2 就是
1,2
……

你说的不错,但是,还有2本身跟2也有关系,另外还少了 1,2,4,16 = 23 的这个,其实最后结果是 每个数字跟自己有关的,都是16种。

#19


该回复于2012-03-29 11:44:55被版主删除

#20


其实就是位运算的问题,1 2 4 8 16可以用5位二进制数来表示,可以表示1-31之间的数,去掉1 2 4 8 16这5个没有与其它数相加的数,就是剩下的26个数

#21


int print_group(void)
{
int i, j;
int ret[5][32];
int ret_long[5];
memset(ret_long, 0, sizeof(ret_long));
for(i=1; i<32; ++i)
{
if(i&0x1) {
ret[0][ret_long[0]++] = i;
}
if(i&0x2) {
ret[1][ret_long[1]++] = i;
}
if(i&0x4) {
ret[2][ret_long[2]++] = i;
}
if(i&0x8) {
ret[3][ret_long[3]++] = i;
}
if(i&0x10) {
ret[4][ret_long[4]++] = i;
}

}
for(i=0; i<5; ++i) {
for(j=0; j<ret_long[i]; ++j) {
printf("%2d, ", ret[i][j]);
}
printf("\n");
}
return 0;
}
C#忘光了,贴个C的。

#22


引用 21 楼  的回复:
C/C++ code
int print_group(void)
{
    int i, j;
    int ret[5][32];
    int ret_long[5];
    memset(ret_long, 0, sizeof(ret_long));
    for(i=1; i<32; ++i)
    {
        if(i&amp;0x1) {
           ……
其实ret[5][32]中的32为16就可以了,一个位要么为1要么为0,即这些数的和要么包含它要么不包含,那就各占一半。而1 2 4 8 16任意多个不重复个数相加的和都不会产生相同的数,那么就只有31个数了,取一半用16个正好。

#23


for(int i =0;i<5;i++)
            {
                for (int j = 0; j < 30; j++)
                {
                    Console.WriteLine(j + Math.Pow(2, i));
                    j = j + 1;
                    Console.WriteLine();
                }
            }
            Console.ReadLine();  你看看是不是你要的结果

#24


这是算法思想的题,与语言无关
一个集合集X运行算法F,得出另一个结果集Y
型如:f([x0,x1,...]) 输出集合[y1,y2.。。]
F([a1,a2])=>[a1a2]//设任意数为a2
F([a1,a2,a3])=>a3与[a1,a2]的历遍和,再历遍F([a1,a2])的和 //设任意数为a3
F([a1,a2,a3,a4])=>a4与[a1,a2,a3]的历遍和,再历遍F([a1,a2,a3])的和 //设任意数为a4
由此推导可以以数学的思路作题,如下:
设X = [A1...An],求F(X)的结果集Y,设任意数为Ax,其中F算法是上面要求的一样

先设临地集合tempArray=集合X移除元素Ax之后的集合;
则结果集Y = Ax历遍tempArray每个元素的和,再合并到F(tempArray)的结果集上

至于这个算法用啥语言实现都不重要,前提是这个算法思路没有错