110,953
社区成员
发帖
与我相关
我的任务
分享
static void Main(string[] args)
{
long n = 5000000000000000000L;//18个0,呵呵
long m = 3L;
Console.WriteLine(Test(n, m));
Console.ReadLine();
}
static long Test(long n, long m)
{
return GetZeroBasedIndex(n, m, 0) + 1;
}
static long GetZeroBasedIndex(long n, long m, long offset)
{
if (n == 1L)
return 0L;
long index = GetZeroBasedIndex(n - (n + offset) / m, m, (n + offset) % m);
return index + (index + offset) / (m - 1);
}
static void Main(string[] args)
{
int n = 50;
int m = 3;
Console.WriteLine(GetOneBasedIndex(n, m));
Console.ReadLine();
}
static int GetOneBasedIndex(int n, int m)
{
return GetZeroBasedIndex(n, m, 0) + 1;
}
//核心代码就这个方法
static int GetZeroBasedIndex(int n, int m, int offset)
{
if (n == 1)
return 0;
int index = GetZeroBasedIndex(n - (n + offset) / m, m, (n + offset) % m);
return index + (index + offset) / (m - 1);
}
class main
{
static void Main()
{
StringBuilder sb = new StringBuilder();
for (int i = 'a'; i <= 'z'; i++)
sb.Append((char)i);
int temp = 1;
int index = 0;
while (sb.Length > 2)
{
if (temp++ < 3)
{
Console.Write(sb[index++] + " ");
}
else
{
Console.Write("(" + sb[index] + " out) ");
sb.Remove(index, 1);
temp = 1;
}
if (index == sb.Length)
index = 0;
}
}
}
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
int n = 50; // 报数人
int m = 3; // 报数范围
Queue<int> num = new Queue<int>(n);
while (n-- > 0)
{
num.Enqueue(n);
for (int i = 1; i < m; i++)
num.Enqueue(num.Dequeue());
}
Console.WriteLine("最后一人是{0}号", num.Count - Array.IndexOf<int>(num.ToArray(), num.Count - 1));
}
}
// 这个报数很像一种翻扑克牌游戏
// 这里假设只剩最后 1 人,然后倒推回 100 人都在
// 受 Queue 右进左出的限制,假设报数是从右往左进行的比较好理解
// 每次在右边补充进去出列的 1 人,就从左边挪出两个人补到右边
// 补充人时, n 表示该人出列的顺序
// 很多人对挪两个人的做法难以理解,那你可以假设有 5 个人报数的情景,
// 3 号出列后,我们让 4 号 5 号挪到队伍开头,然后全队从 1 开始报号
// 这个过程倒推回去就是本程序的想法。
/* 你可以把这段代码加在程序最后,进行验证。
n = num.Count;
int[] result = new int[n];
foreach (int i in num)
result[i] = n--;
foreach (int i in result)
Console.WriteLine("第{0}个人出列.", i);
*/