在 C# 中返回 2 小于 n 的所有幂 [关闭]

问题描述 投票:0回答:5

对于给定的数字 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()); 
} 
} 
c# arrays
5个回答
1
投票

您需要使用以下规则运行 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);
        }

1
投票

使用迭代器方法使这种情况变得微不足道(Fiddle):

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));
    }
}

0
投票

我想这就是你要找的:

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();
    }
}

0
投票

它不起作用的原因是:您永远不会以任何方式访问课程

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-
,所以还有一些东西需要修复。也许你有点感觉为什么每个人都提出了一个完全不同的解决方案。

还有什么要解决的:

  • 当然输出仍然不正确。
  • 如果有人输入 4000000000 作为数字,您当然不想在数组中分配 4 GB 的 RAM。
  • 为什么要分配一个数组而不是立即构造字符串?
  • 为什么
    8*sizeof(uint)
    ?你不能比
    sizeof(uint)
    .
  • 更频繁地移动

-1
投票
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);
    }

} 
© www.soinside.com 2019 - 2024. All rights reserved.