#include<stdio.h> //本题的意思是每个人从1开始编号,第一个人编号为1,第二个人编号为2,以此类推。 //当数到3有人淘汰后,该人的后一个人接着从1开始报数,如此循环往复。问最后留下来的那个人的编号 //也就是问最后留下来的那个人是最初队伍的第几个人 int main() { int n; while (scanf("%d", &n) != EOF) { if (n == 0) break; // 我们假定 1~n个人,我们把第一个编号为0,最后一个人编号为n-1 int res = 0; //当i=1,即只有一个人的时候,编号为0; 这是初始情况 for(int i = 2; i <= n; i++){ res = (res + 3) % i; // 递推公式为 f(n) = (f(n-1) + m) % n,此处m=3 } printf("%d\n", res + 1); //因为我们假定的编号比题目要求输出的少1,所以最后还要加上1 } return 0; } //二刷 本题其实没有描述清楚。下面的写法在Devc++能过,且能对。但OJ显示递归太多,报错 //#include<stdio.h> //本题的意思是每个人从1开始编号,第一个人编号为1,第二个人编号为2,以此类推。 //当数到3有人淘汰后,该人的后一个人接着从1开始报数,如此循环往复。问最后留下来的那个人的编号 //也就是问最后留下来的那个人是最初队伍的第几个人 //long long dp[100]; //题目没说n最多不超过几,所以这里随意假定了一个值 //void Initial(){ // dp[1] = 1; //假设最开始只有一个人的时候,编号为1; 这是初始情况 // dp[2] = 2; //当有两个人的时候,最后留下来的是第二个人,第二个人编号为2 // for(int i=3; i<100; i++){ // dp[i] = (dp[i-1] + 3) % i; //递推公式 f(n) = (f(n-1) + m) % n,此处m=3, n就是这里的i // } // return; //} // //int main(){ // Initial(); // int n; // while(scanf("%d", &n) != EOF) { // if (n == 0) break; // else printf("%lld\n", dp[n]); // } // return 0; //} |
Double click to view unformatted code.