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的数字-我不介意有额外的逻辑 /和%是您在这里的朋友: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的数字-我不介意有额外的逻辑 /和%是
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 });
}