C# 约瑟夫环 用数组实现

约瑟夫环

已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

运行效果

请输入总人数:
666
从第几个人开始:
66
从1数到几:
6
71 77 83 89 95 101 107 113 119 125 131 137 143 149 155 161 167 173 179 185 191 197 203 209 215 221 227 233 239 245 251 257 263 269 275 281 287 293 299 305 311 317 323 329 335 341 347 353 359 365 371 377 383 389 395 401 407 413 419 425 431 437 443 449 455 461 467 473 479 485 491 497 503 509 515 521 527 533 539 545 551 557 563 569 575 581 587 593 599 605 611 617 623 629 635 641 647 653 659 665 5 11 17 23 29 35 41 47 53 59 65 72 79 86 93 100 108 115 122 129 136 144 151 158 165 172 180 187 194 201 208 216 223 230 237 244 252 259 266 273 280 288 295 302 309 316 324 331 338 345 352 360 367 374 381 388 396 403 410 417 424 432 439 446 453 460 468 475 482 489 496 504 511 518 525 532 540 547 554 561 568 576 583 590 597 604 612 619 626 633 640 648 655 662 3 10 18 25 32 39 46 54 61 68 76 85 94 103 111 120 128 138 146 154 163 171 181 189 198 206 214 224 232 241 249 258 267 276 284 292 301 310 319 327 336 344 354 362 370 379 387 397 405 414 422 430 440 448 457 465 474 483 492 500 508 517 526 535 543 552 560 570 578 586 595 603 613 621 630 638 646 656 664 7 15 24 33 42 50 58 67 78 88 98 109 118 130 140 150 160 170 182 192 202 212 222 234 243 254 264 274 285 296 306 315 326 337 348 357 368 378 390 399 409 420 429 441 451 462 471 481 493 502 513 523 534 544 555 565 574 585 596 607 616 627 637 649 658 2 13 22 34 44 55 64 75 90 102 114 126 139 152 164 176 188 200 213 226 238 250 262 277 289 300 313 325 339 350 363 375 386 400 412 426 436 450 463 476 487 499 512 524 537 549 562 573 588 600 610 624 636 650 661 8 20 31 45 57 70 84 99 116 132 145 159 175 190 205 219 235 248 265 279 294 308 322 340 355 369 384 398 415 428 444 458 472 488 505 519 531 548 564 579 592 608 622 639 652 1 16 30 48 62 80 96 112 133 148 168 184 204 220 240 256 272 291 312 330 346 364 382 402 418 435 454 470 490 507 528 542 559 580 598 615 632 651 4 21 38 56 74 97 121 141 162 183 207 228 247 270 290 314 333 356 376 394 421 442 464 484 506 529 550 571 591 614 634 657 12 36 52 81 105 127 156 178 210 231 260 283 307 334 361 391 411 438 466 494 516 541 567 594 620 644 6 28 60 87 117 147 177 211 242 271 303 332 366 393 427 456 486 520 553 582 609 643 9 40 69 106 142 186 218 255 297 328 372 406 445 478 514 556 589 628 663 37 73 123 166 199 253 298 343 385 433 477 522 566 606 654 27 82 134 193 236 286 349 404 452 501 558 618 666 51 110 174 246 318 373 434 498 572 631 26 92 169 261 321 408 480 546 642 49 135 225 320 416 510 601 19 124 229 351 459 577 14 153 278 392 536 660 157 304 469 625 104 342 530 63 268 495 66 358 602 217 584 282 43 447 380 196 423 645 538 195 剩下的人是:91
请按任意键继续. . .

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _6_10同学报数
{
    class Program
    {
        static void Main(string[] args)
        {
            //输入总数
            int total;
            Console.WriteLine("请输入总人数:");
            total = int.Parse(Console.ReadLine());

            bool[] a = new bool[total];

            //输入从第几个开始数
            int begin;
            Console.WriteLine("从第几个人开始:");
            begin = int.Parse(Console.ReadLine());

            //数到几
            int count;
            Console.WriteLine("从1数到几:");
            count = int.Parse(Console.ReadLine());

            //全部为true
            for (int i = 0; i < total; i++)
            {
                a[i] = true;
            }

            //开始删除
            int iter = begin - 1;
            int countnum = 1;
            int left = total;
            while (left != 1)               //如果剩一个人,停止
            {
                if (a[iter] == false)		//如果这个人已经被删除,跳过
                {
                    iter++;
                    iter %= total;
                    continue;
                }

                if (countnum == 0)          //如果当前人报3(即余3得0),删除这个人
                {
                    a[iter] = false;
                    left--;
                    Console.Write(iter + 1 + " ");
                }

                iter++;                     //下一个人
                iter %= total;

                countnum++;                 //下一个人报的数
                countnum %= count;
            }

            //剩下的数字
            for (int i = 0; i < total; i++)
            {
                if (a[i] == true)
                {
                    Console.Write("剩下的人是:" + (i + 1) + "\n");
                    break;
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/88724831