对于给定的数字 n,我需要返回所有小于 n 的 2 的幂,作为一个字符串,元素用“-”分隔。如果 n < 2, it needs to return an empty string.
例如:
n = 20 => 1-2-4-8-16
n = 8 => 1-2-4
我是初学者,所以任何帮助将不胜感激! :)
编辑:这不起作用
using System;
class N
{
static int[] powerof2(int n)
{
int[] array = new int[n];
if (n < 2)
return new int[0];
for (int i = 0; i < 8 * sizeof(uint); i++)
{
int curr = 1 << i;
if (curr > n)
break;
array[i] = curr;
}
return array;
public override string ToString()
{
for (int i = 0; i < array.length; i++)
return (array[i] + "-");
}
}
static public void Main ()
{
int n = 10;
Console.WriteLine(powerof2(n).ToString());
}
}
您需要使用以下规则运行 for 循环
for (int i = 1; i < n; i *= 2)
整体解决方案
class Program
{
static void powerof2(int n)
{
if (n < 2)
Console.WriteLine(string.Empty);
for (int i = 1; i < n; i *= 2)
{
if (i > 1)
Console.Write("-");
Console.Write(i);
}
}
static void Main(string[] args)
{
powerof2(20);
}
using System;
using System.Collections.Generic;
public class Program
{
public static IEnumerable<int> GetPowersOf2(int maxN)
{
for (int p = 1; p < maxN; p *= 2)
{
yield return p;
}
}
public static void Main(string[] args)
{
IEnumerable<int> powersOf2LessThan20 = GetPowersOf2(20);
Console.WriteLine(string.Join("-", powersOf2LessThan20));
}
}
我想这就是你要找的:
class Program
{
public static string Pow2LessThan(ulong n)
{
if (n < 2)
return "";
// start with 2^0
string res = "1";
// try further
int p = 1;
ulong cnum = 2;
while (cnum < n)
{
res += "-" + cnum.ToString();
++p;
cnum = (ulong)(1 << p);
}
return res;
}
static void Main(string[] args)
{
ulong n = 20;
Console.WriteLine(Pow2LessThan(n));
Console.ReadLine();
}
}
它不起作用的原因是:您永远不会以任何方式访问课程
N
。电话应该是
Console.WriteLine(N.powerof2(n).ToString());
^^
通过该修改,您将收到通知,由于其保护级别,
powerof2()
方法无法访问。您至少需要像这样在内部制作它:
internal static int[] powerof2(int n)
接下来,请注意您缺少该方法的
}
。
return array;
}
修复后,编译器会告诉您无法访问
array
内部的ToString()
,因为array
的范围仅限于powerof2()
。使数组成为类的一个字段,如
static int[] array;
现在,编译器在
array.length
中抱怨 ToString()
。通过大写Length
来解决这个问题。
错误 6:
ToString()
将在循环的第一次迭代中返回。如果 array.Length
为 0,它不会返回任何内容。该函数看起来应该有点像这样:
public override string ToString()
{
string result = "";
for (int i = 0; i < array.Length; i++)
result += array[i] + "-";
return result;
}
现在,这仍然不起作用,因为 main 方法在
ToString()
的返回值上调用 powerof2()
,它是 int[]
类型而不是 N
类型。那是因为你的东西是静态的。改为使其非静态并创建N
.的实例
static public void Main ()
{
var n = new N();
n.powerof2(10);
Console.WriteLine(n.ToString());
}
修复了 7 个问题,现在输出为
1-2-4-8-0-0-0-0-0-0-
,所以还有一些东西需要修复。也许你有点感觉为什么每个人都提出了一个完全不同的解决方案。
还有什么要解决的:
8*sizeof(uint)
?你不能比sizeof(uint)
.class Program
{
static string powerof2(int n)
{
var str = "1" ;
if (n < 2)
return "" ;
else
{
var i = 1;
while(Math.Pow(2, i)<n)
{
str+="-" +Math.Pow(2, i);
i++;
}
return str;
}
}
static void Main(string[] args)
{
powerof2(50);
}
}