求教一个算法(关于等比数列)

pfworld 2014-06-06 04:19:40
A:1、B:2、C:4、D:8、E:16、F:32、G:64、H:128

代表8个对象,现在给你个数字(这个数字是8个对象任意相加),找出这个数字是由那几个对象组成的(每个对象每次只能使用1次)!

例如:29这个数字

16+8+4+1=29

有没有好的办法或者方法可以快速的得出29这个数字,是否包含A-H任意对象。(例如:我要在29这个数字内看16是否包含在内。)

目前写的方法太过繁琐!寻求高效的解决方法!
...全文
356 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
keyboard3_ 2014-06-06
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
请告诉我这不是二进制么??? 29=11101=1*2^4+1*2^3+1*2^2+0*2^1+1*2^0=16+8+4+0+1
+1 说的很清楚呀!!
dianjixue1 2014-06-06
  • 打赏
  • 举报
回复
如果A-H就是楼主所列出的这些数,那这不就是位运算吗?

/// <summary>
        /// 看数num是否包含A
        /// </summary>
        /// <param name="A">1、2、4、8、16、32、64、128中任意一个数</param>
        /// <param name="num">任意整数</param>
        /// <returns>true-包含;false-不包含</returns>
        private bool ifNumContrainA(int A, int num)
        {
            return (A & num) == A;
        }
md5e 2014-06-06
  • 打赏
  • 举报
回复
int n = 29; int i = 0; string txt = n + "="; while (n >= 1) { if (n % 2 != 0) { txt += Math.Pow(2, i) + "+"; } n = n >> 1; i++; } Response.Write(txt.TrimEnd('+')); Response.End();
fox_sky 2014-06-06
  • 打赏
  • 举报
回复
static int[] SplitsAll(int number) { List<int> list = new List<int>(); int r = 0; do { int n = number % 2; if (n > 0) { list.Add((int)Math.Pow(2, r)); } r++; number /= 2; } while (number > 0); return list.ToArray(); }
md5e 2014-06-06
  • 打赏
  • 举报
回复
就是二的平方根,然后用位移
  • 打赏
  • 举报
回复
这不就是循环获取Flag枚举么。。。。。。 [Flag] enum SomeEnum { A=1, B=2, C=4 } 循环代码 SomeEnum se = SomeEnum.A|SomeEnum.B; return se&SomeEnum.C==SomeEnum.C;
涛锅 2014-06-06
  • 打赏
  • 举报
回复
还是用位运算吧
wanghui0380 2014-06-06
  • 打赏
  • 举报
回复
请告诉我这不是二进制么??? 29=11101=1*2^4+1*2^3+1*2^2+0*2^1+1*2^0=16+8+4+0+1
gomoku 2014-06-06
  • 打赏
  • 举报
回复
用位操作就可以了(或者用枚举):

class Tests
{
    [Flags]
    enum Options
    {
        A = 1,
        B = 2,
        C = 4,
        D = 8,
        E = 16,
        F = 32,
        G = 64,
        H = 128,
    }
    
    static bool HasOption(Options options, Options option)
    {
        return (options & option) == option;
    }

    static bool HasBit(int number, int bit)
    {
        return (number & bit) == bit;
    }

    static void Main(string[] args)
    {
        bool hasE = HasOption((Options)29, Options.E);   // hasE = true
        bool has16 = HasBit(29, 16);  // has16 = true;
    }
}
pfworld 2014-06-06
  • 打赏
  • 举报
回复

        private int intDinVuale;
        private int[] intArr = { 1, 2, 4, 8, 16, 0 };
        private int[] intArrSum;     

 private void Find()
  {
            intDinVuale = 29
            intArrSum = new int[5];

            for (int y = 0; y < 6; y++)
            {
                for (int u = 1; u < 6; u++)
                {
                    for (int i = 2; i < 6; i++)
                    {
                        for (int o = 3; o < 6; o++)
                        {
                            for (int p = 4; p < 6; p++)
                            {
                                if (intDinVuale == intArr[y] + intArr[u] + intArr[i] + intArr[o] + intArr[p])
                                {
                                    intArrSum[0] = intArr[y];
                                    intArrSum[1] = intArr[u];
                                    intArrSum[2] = intArr[i];
                                    intArrSum[3] = intArr[o];
                                    intArrSum[4] = intArr[p];
                                }
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < 5; i++)
            {
                if (intArrSum[i] == 16)
                {
                   //找到16
                }

                if (intArrSum[i] == 8)
                {
                   //找到8
                }

                if (intArrSum[i] == 4)
                {
                    //找到4
                }

                if (intArrSum[i] == 1)
                {
                   //找到1
                }
            }
        }
}
使用了一个笨方法!
pfworld 2014-06-06
  • 打赏
  • 举报
回复
万分感谢,效率一下提高了!这方面太薄弱了!

111,092

社区成员

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

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

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