0

我想找到给定某个数字的所有 3 的倍数,并找到余数。

例如:

给定数字 10:3 的倍数 = {3;6;9} + 余数 = 1

给定数字 11:3 的倍数 = {3;6;9} + 余数 = 2

我到目前为止的算法(但不是代码)是这样的:

  1. 检查 X 是否是 3 的倍数 - 是 - 返回倍数(无余数);
  2. 不?x-1 是 3 的倍数 - 是 - 返回倍数(1 个余数);
  3. 不?x-2 是 3 的倍数 - 是 - 返回倍数(余数为 2);

有没有更好的方法来做到这一点,使用更少的代码?

编辑:还有 2 件事,我只寻找 3 - 所以这可能是一个 const。还有任何小于 3 的数字:2、1 和 0 - 我不介意为此添加额外的逻辑。

4

10 回答 10

13
IEnumerable<int> Foo(int n, int k)
{
  int m = k;
  while (m <= n)
  {
    yield return m;
    m += k;
  }

  yield return m - n;
}
于 2013-08-09T13:05:29.200 回答
12

整数除法( /) 和模数( %) 是您的朋友:

var multiples = num / 3;
var remainder = num % 3;
于 2013-08-09T13:03:28.833 回答
4

x = 给定数
y = 循环数

让 y 从 0 循环到 x,同时每次增加 3。
如果 y > x 则提示为 (x-(y-3))

于 2013-08-09T13:04:50.667 回答
1

您可以使用除法器 / 和模数 %

http://msdn.microsoft.com/en-us/library/3b1ff23f.aspx

10 / 3 = 3

http://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx

10 % 3 = 1
于 2013-08-09T13:04:34.407 回答
1
int number = 10;
int divisor = 3;

List<int> numbers;

// Find all the numbers by incrementing i by the divisor.
for(int i = 0; i < number; i += divisor)
{
    numbers.Add(i);
}

// Find the remainder using modulus operator.
int remainder = number % divisor;
于 2013-08-09T13:05:33.057 回答
1

这是您的确切输出

private static void Main(string[] args)
    {
        int num = 10;
        int divisor = 3;

        if(num<divisor)
            Console.Write(num + " is less than " + divisor);

        Console.Write("Given the number " + num + " : multiples of " + divisor + " = {");

        for (int i = divisor; i < num; i+=divisor)
            Console.Write((i!=3) ? ";"+i : i.ToString());

        Console.Write("} + remainder = " + num%divisor);

    }

输出

Given the number 10 : multiples of 3 = {3;6;9} + remainder = 1

并检查输入是否小于除数

于 2013-08-09T13:07:34.233 回答
1

您可以简单地枚举输出值

  public static IEnumerable<int> GetMultiples(int value, int divisor) {
    // Be care of negative and zero values...
    if ((value <= 0) || (divisor <= 0))
      yield break;

    // Multiplications
    for (int i = 1; i <= value / divisor; ++i)
      yield return i * divisor;

    // Finally, let's return remainder if it's non-zero
    if ((value % divisor) != 0)
      yield return value % divisor;
  }

  ...

  foreach(int item in GetMultiples(10, 3)) { // item will be 3, 6, 9, 1
    ...
  }
于 2013-08-09T13:16:15.187 回答
0

您可以使用运算符模

%

但是如果你使用很多,它会很慢......

于 2013-08-09T13:08:40.597 回答
0

这将为您提供所需的输出:

            int num;
            Console.WriteLine("give me a number equal or above 3!");
            int.TryParse(Console.ReadLine(),out num);
            int i = 0;
            List<int> nums = new List<int>();
            i += 3;
            while (i <= num)
            {
                nums.Add(i);
                i += 3;
            }

            Console.Write("Numbers are: ");
            foreach (int y in nums)
            {
                Console.Write(y + " , ");
            }
            Console.WriteLine("The remainder is " + (num - nums[nums.Count - 1]));
于 2013-08-09T13:29:51.470 回答
0

LINQ 不是专门为此而构建的吗?

IEnumerable<int> GetMultiples(int max)
{
    return Enumerable.Range(1, max / 3)
                     .Select(p => p * 3)
                     .Concat((max %= 3) == 0 ? new int[0] : new int[] { max });
}
于 2013-08-09T13:36:17.063 回答