C# C返回一个数中的一个数与余数的倍数?

C# C返回一个数中的一个数与余数的倍数?,c#,C#,我想找到给定某个数的所有3的倍数,同时也要找到余数 例如: 给定数字10:3={3;6;9}+余数的倍数=1 给定数字11:3={3;6;9}+余数的倍数=2 到目前为止,我使用的算法(但没有代码)如下所示: 检查X是否是3的倍数-是-返回倍数无余数; 不x-1是3的倍数-是-返回倍数1余数; 不x-2是3-是-返回多个2余数的倍数; 有没有更好的方法做到这一点,使用更少的代码 编辑:还有2件事,我只想找3件-所以这可能是一个常数。还有任何小于3:2,1和0的数字-我不介意有额外的逻辑 /和%是

我想找到给定某个数的所有3的倍数,同时也要找到余数

例如:

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

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

到目前为止,我使用的算法(但没有代码)如下所示:

检查X是否是3的倍数-是-返回倍数无余数; 不x-1是3的倍数-是-返回倍数1余数; 不x-2是3-是-返回多个2余数的倍数; 有没有更好的方法做到这一点,使用更少的代码

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

/和%是您在这里的朋友:

var multiples = num / 3;
var remainder = num % 3;

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

x=给定的数字 y=回路编号

将y循环从0增加到x,同时每次增加3。
如果y>x,则重锤为x-y-3

这是您的精确输出

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

  yield return m - n;
}
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);

    }
输出

给定数字10:3={3;6;9}+余数的倍数=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
    ...
  }

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

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

林克不是为这个而建的吗

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

哇,我真的希望没有人这么做。嘿,我只是给出了同样的答案,我知道OP的要求:@F.B.tenKate为什么?他想要的是0和x之间的所有数字,都是3和remainder@F.B.tenKate他怎么不想数数呢?他想数数。@Leppie你说得对。。。虽然这不是最容易回答的问题,但在我的辩护中,这是一个悬而未决的问题,在一分钟内看到5个答案我并不感到惊讶。投慢球的方式,@JL@JesseSmith这样的问题对程序员来说就像猫爪一样,我想——我们就是忍不住要回答它们。是的,这个答案看起来是最棒的,在读了5遍问题之后:考虑到你的问题的措辞方式,这让我感到惊讶。我现在糊涂了@当然,没有什么像是一个完整的解决方案,但OP似乎缺少了一些基本的构建模块。有时候,我们的工作是教一个人如何钓鱼……同意,我给出了和你一样的答案,现在删除了它,因为像其他9个人一样,你也做了同样的回答,但是叶,他用词提问的方式莱皮的问题是最完整的。不管怎样,教一个人钓鱼是件好事。。。或在本例中,Math.@F.B.tenKate-我认为,在本例中,是C运算符;我觉得很奇怪,你会为10创建一个变量,使它很容易与任何其他数字互换,但不适用于3。只是说,只是很快把它敲定,好了
  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
    ...
  }
            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]));
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 });
}