View Code of Problem 80

#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.


Back to problem 80