问题描述
M个人围成一圈报数,数到N(1<N<10)的倍数或包含N这个数字时出圈,问剩下的最后一个人在原来的位置是多少?
报数规则:
1、从第一个人开始报数为1,下一个人报数为上一个人报数加1
2、报数的最大值为2000,如果报数超过2000,则下一个人重新从1开始报数
要求实现函数
int OutFunc (unsigned int iTotalNum, unsigned int iKey)
【输入】iTotalNum: 开始报数前的总人数, 0<iTotalNum<65535
iKey: 题目中要求的数目N
【输出】无
【返回】剩下的人的原来的位置
示例
输入:iTotalNum =5, iKey =3
返回:4
输入:iTotalNum =15, iKey =3
返回:10
/* 出圈问题 */
#include <stdioh>
#define MAXSIZE 1000
bool containN(unsigned int i, unsigned int N)
{
unsigned int temp = 0;
while(i > 0)
{
temp = i % 10;
i = i / 10;
if((temp == N) || (i == N))
{
return true;
}
}
return false;
}
void OutFunc (unsigned int iTotalNum, unsigned int iKey)
{
unsigned int N = iKey;
unsigned int i = 0;
unsigned int j = 0;
unsigned int K = 0;
unsigned int m = 0;
unsigned int t = 0;
unsigned int pre = 0;
unsigned int aa[MAXSIZE] = {'\0'};
unsigned int p[MAXSIZE] = {'\0'};
/* 找出2000内N 的倍数,及包含N这个数字的数 */
for(i = 1; i <= 2000; i++)
{
if((i % N == 0) ||
((i % N != 0) && (containN(i, N) == true)))
{
p[K++] = i - pre;
pre = i;
}
}
p[K] = '\0';
K = 0;
for(i = 0; i < iTotalNum; i++)
{
aa[i] = i + 1;
}
for(i = iTotalNum; i >= 1; i--)
{
m = p[K++];
if(p[K] == '\0')
{
K = 0;
}
t = (t + m - 1) % i;
pri
华为上机---出圈问题及答案 来自淘豆网www.taodocs.com转载请标明出处.