C++实现在UNAL镇有一个新的巨大的轮子,在UNAL镇,轮子逆时针方向移动,而且这个轮子有n个小屋,每个人都可以玩。特别是,数字来到这个景点。然而,一个完整的数字并不适合一个船舱,事实上,每个船舱只有一个比特的空间。由于这个原因,一个数字从它的二进制中分裂出来,并在每个舱室的每个位上运行。由于数字不想把它搞砸,比特以与数字形成相同的顺序进入吸引力。尽管如此,轮子移动了k次(进出吸引点不算移动),那么当比特必须离开轮子时,它们可能不会按照它们进入的顺序进行,因此会产生不同的数字。 例如,当数字13进入一个密集的8位时,它看起来像下图的左侧,5次移动后,车轮看起来像图像的右侧,在这种情况下,从车轮退出的数字将是161。第一行输入包含2个数字n(1≤n≤50)和m(1≤m≤1000)——分别是车轮上的舱室数量和车轮上乘坐的数字数量。接下来的m行输入分别包含2个整数num(0≤num < 2n)和k(1≤k≤1018)——分别是骑轮子的次数和轮子移动的次数。对于每个乘坐车轮的数字,打印出离开车轮后的结果数字。以十进制形式输出这个数字具体代码
时间: 2023-02-16 18:50:32 浏览: 143
这道题的要求是给定一个数字,将这个数字的二进制表示分成n个部分,每个部分放在一个小屋里面,然后让轮子转动k次,最后输出数字的二进制表示。
首先,我们可以将输入的数字转换成二进制表示,存储在一个数组里面。然后我们可以模拟轮子的转动过程,每次将数组向右移动一位。最后,我们可以将数组转换回十进制数字并输出。
代码如下:
```
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 读入n和m
int n, m;
scanf("%d%d", &n, &m);
// 遍历每个数字
while (m--)
{
// 读入num和k
long long num, k;
scanf("%lld%lld", &num, &k);
// 将num转换成二进制表示
int binary[n];
for (int i = 0; i < n; i++)
{
binary[i] = num % 2;
num /= 2;
}
// 模拟轮子的转动过程
for (int i = 0; i < k % n; i++)
{
int temp = binary[n - 1];
for (int j = n - 1; j > 0; j--)
{
binary[j] = binary[j - 1];
}
binary[0] = temp;
}
// 将数组转换回十进制数字并输出
long long result = 0;
for (int i = 0; i < n; i++)
{
result = result * 2 + binary[i];
}
printf("%lld\n", result);
}
return 0;
}
```
阅读全文