列表

详情


OR45. 删数

描述

有一个数组 a[N] 顺序存放 0 ~ N-1 ,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以 8 个数 (N=7) 为例 :{ 0,1,2,3,4,5,6,7 },0 -> 1 -> 2 (删除) -> 3 -> 4 -> 5 (删除) -> 6 -> 7 -> 0 (删除),如此循环直到最后一个数被删除。

数据范围:

输入描述

每组数据为一行一个整数n(小于等于1000),为数组成员数

输出描述

一行输出最后一个被删掉的数的原始下标位置。

示例1

输入:

8

输出:

6

示例2

输入:

1

输出:

0

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 224KB, 提交时间: 2018-08-09

#include "stdio.h"
#include "malloc.h"

int DeleteData(int *Input,int *OutPut,int len,int yu)
{
    int i,cnt;
    cnt=0;
    for(i=0;i<len;i++)
    {
        
        if((i+yu)%3==2)
        {
            
        }
        else
        {
            OutPut[cnt]=Input[i];
            cnt++;
        }
        
    }
    yu=(len+yu)%3;
    if(cnt==1)
    {
        return OutPut[0];
    }
    else
    {
        return DeleteData(OutPut,Input,cnt,yu);
    }
}
int main()
{
    int Num;
	int i;
	int reSult;
	while(~scanf("%d",&Num))
	{
		if(Num>=1000)
		{
			Num=999;
		}
		int OutPut[1000];
		int Input[1000];
		for(i=0;i<1000;i++)
		{
			Input[i]=i;
		}
    
		reSult=DeleteData(Input,OutPut,Num,0);
		printf("%d\n",reSult);
	}
    return 0;    
}

C 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2020-02-07

#include <stdio.h>

int main()
{
    int num = 0;
    while (scanf("%d", &num) != EOF)
    {
        int i = 0;
        int target = 0;
        for (i = 2; i <= num; i++)
        {
            target = (target + 3) % i;
        }
        /*
        int target = 0;
        int size = num;
        while (size > 1)
        {
            target = (target + 3) % size;
            size--;
        }
        */
        printf("%d\n", target);
    }
    return 0;
}

上一题