求 其中的任意一个数 和 其他的任意多个或者一个数的和 的所有值
比如 跟 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
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
为啥我觉着是数学的排列组合啊。。。
#10
为啥堪称排列组合?别人却能理解成位的概念。这就是数学脑袋和计算机脑袋的区别。
#11
额。。。我想的思路就是排列组合式的把结果全算出来,木有啥位的概念- -
感觉按排列组合也挺简单的,如果要顺序的话最后排个序就OK了
#12
利用数组即可实现
#13
这个是错的,请无视,7#的思路很抢眼啊,呵呵
#14
强大的linq.....
#15
等一下验证一下,好像ok的
#16
00001
00010
00100
01000
10000
求的值为某一固定位的所有组合:
00001 00011 00101 00111 01001……
00010 00011 00110 00111 01010……
00010
00100
01000
10000
求的值为某一固定位的所有组合:
00001 00011 00101 00111 01001……
00010 00011 00110 00111 01010……
#17
跟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
你说的不错,但是,还有2本身跟2也有关系,另外还少了 1,2,4,16 = 23 的这个,其实最后结果是 每个数字跟自己有关的,都是16种。
#19
#20
其实就是位运算的问题,1 2 4 8 16可以用5位二进制数来表示,可以表示1-31之间的数,去掉1 2 4 8 16这5个没有与其它数相加的数,就是剩下的26个数
#21
int print_group(void)C#忘光了,贴个C的。
{
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;
}
#22
其实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(); 你看看是不是你要的结果
{
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)的结果集上
至于这个算法用啥语言实现都不重要,前提是这个算法思路没有错
一个集合集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
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
为啥我觉着是数学的排列组合啊。。。
#10
为啥堪称排列组合?别人却能理解成位的概念。这就是数学脑袋和计算机脑袋的区别。
#11
额。。。我想的思路就是排列组合式的把结果全算出来,木有啥位的概念- -
感觉按排列组合也挺简单的,如果要顺序的话最后排个序就OK了
#12
利用数组即可实现
#13
这个是错的,请无视,7#的思路很抢眼啊,呵呵
#14
强大的linq.....
#15
等一下验证一下,好像ok的
#16
00001
00010
00100
01000
10000
求的值为某一固定位的所有组合:
00001 00011 00101 00111 01001……
00010 00011 00110 00111 01010……
00010
00100
01000
10000
求的值为某一固定位的所有组合:
00001 00011 00101 00111 01001……
00010 00011 00110 00111 01010……
#17
跟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
你说的不错,但是,还有2本身跟2也有关系,另外还少了 1,2,4,16 = 23 的这个,其实最后结果是 每个数字跟自己有关的,都是16种。
#19
#20
其实就是位运算的问题,1 2 4 8 16可以用5位二进制数来表示,可以表示1-31之间的数,去掉1 2 4 8 16这5个没有与其它数相加的数,就是剩下的26个数
#21
int print_group(void)C#忘光了,贴个C的。
{
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;
}
#22
其实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(); 你看看是不是你要的结果
{
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)的结果集上
至于这个算法用啥语言实现都不重要,前提是这个算法思路没有错
一个集合集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)的结果集上
至于这个算法用啥语言实现都不重要,前提是这个算法思路没有错