注册 登录
编程论坛 ASP.NET技术论坛

用到这个,才觉得数学没学好是这样的痛苦!这个要怎么样弄?(已解决)

史前大暴龙 发布于 2007-04-17 15:49, 502 次点击
请问一下,我有一系列的数,全是2的次方,开始的数为1,2,4,8,16,32,64,128,256,512,1024,2048.....
随便给一个由那些数中某几个数的和,那我要怎么样才知道是由哪几个数加的啊??
例如:
给一个数是:6,我就要得到2和4
给一个数是:49,我就要得到是由:1,16,和32
救命啊!!!!

[此贴子已经被作者于2007-4-17 15:58:17编辑过]

2 回复
#2
Kendy1234562007-04-17 16:04

思路大致如下

初始化 a(i) = 2的i次方


当 A 不等于 0
找到对应数字A的 a(i)的最接近的一个值 但是这个值不能比A大
A = A -a(i)
循环

把循环中的a(i)记录下来 就是你要的数列

#3
bygg2007-04-17 17:08
我这里有一种方法,可能有点复杂,但是功能还是实现了的.呵/

[CODE]
using System;
using System.Collections.Generic;
using System.Text;

namespace caMath
{
class Program
{
static int n = 0;
static int FiNum = 1;
static void Main(string[] args)
{
int inputNum;
while (true)
{
Console.WriteLine("请输入一个数字:");
try
{
inputNum = Convert.ToInt32(Console.ReadLine());
n = 0;
checkNum(inputNum);
Console.WriteLine("{0} 包含的数有:",inputNum);

for(int i = 0 ;i < n ;i++)
{
FiNum = 1;
checkNum(inputNum);
inputNum -= FiNum;

if (inputNum == 0)
{
Console.WriteLine("{0}", FiNum);
break;
}
else if (inputNum != 1 || inputNum != 2)
{
Console.WriteLine("{0}", FiNum);
}
}
}
catch
{
Console.WriteLine("只能输入数字,谢谢!\r\n");
}
}
}
static void checkNum(int num)
{
if (num % 2 == 0)
{
if (num != 0)
{
num /= 2;
n++;
FiNum *= 2;
checkNum(num);
}
}
else
{
checkNum(num - 1);
}
}
}
}

[/CODE]
1