题解 | #删数#
删数
http://www.nowcoder.com/practice/f9533a71aada4f35867008be22be5b6e
思路:如果是第1个数和第二个数,每次都将除第一个数外的其他数往前挪一位,第一个数挪到最后一位;
如果是第3个数(每次都删除了数,所以这个数现在也在第一位),那就将除第一位数外的其他数往前挪一位。
第一位处理:
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 0(记录第一位数0,除第一位数外其他数往前挪一位)
1 2 3 4 5 6 7 0(让最后一位等于刚刚记录的数)
第二位处理:
1 2 3 4 5 6 7 0
2 3 4 5 6 7 0 (记录第一位数1,除第一位数外其他数往前挪一位)
2 3 4 5 6 7 0 1(让最后一位等于刚刚记录的数)
第三位处理:
2 3 4 5 6 7 0 1
3 4 5 6 7 0 1 (=除第一位数外其他数往前挪一位)
int n = 0;
int num[1000] = {0};
int i = 0;
int length = 0;
int count = 0;
int k = 0;
int j = 0;
while(~scanf("%d", &n)){
length = n;
for(i = 0; i < n; i++){
num[i] = i;
}
while(length > 1) {
count++;
k = num[0];
for(j = 0; j < length-1; j++){
num[j] = num[j+1];
}
if(count != 3){
num[j] = k;
}
else{
num[j] = 0;
count = 0;
length--;
}
}
printf("%d\n", num[0]);
}
}