给定一个数字 N。我需要以二进制形式切换 N 的中间位并以十进制形式打印结果。
状况:
如果 N 的二进制形式的位数为奇数,则切换中间位(如 111 到 101)。
如果 N 的二进制形式的位数是偶数,则切换两个中间位(如 1111 到 1001)
注意:切换一点意味着将 0 转换为 1,反之亦然。
输入:输入的第一行包含 T 表示测试用例的数量。T 测试用例如下。每个测试用例包含一个数字 N。
输出:对于每个测试用例,在一个新行中,在切换 N 的中间位后打印十进制形式。
约束条件:1 <= T <= 100 1 <= N <= 106
示例: 输入:2 3 5 输出:0 7
测试用例 1:N=3。二进制为 11。切换中间位:00。十进制的 00 为 0。Testcase2:N=5。二进制是 101。切换中间位:111。十进制的 111 是 7。
这是我的方法:我将采用十进制数作为输入并将其转换为二进制,然后根据条件切换位并再次将其转换回二进制。
但是,一旦我将其转换为二进制(为此我使用 32 位大小的数组来保持最大可能)我无法找到切换位的方法..也是由于使用了太多循环,我觉得我的时间复杂度会很糟糕,直到我最终将其转换回十进制形式。
这是我迄今为止尝试过的代码:
#include<iostream>
using namespace std;
int main()
{ int t,i;
cin>>t; //test cases
for(i=0;i<t;i++)
{ int n;
cin>>n;
//convert to binary …Run Code Online (Sandbox Code Playgroud) 我是 C++ 的初学者。我正在写一个link list我可以调用我的函数来插入这样的节点:
(假设a和b和c的,我想插入数据link list。
list.insert(a)->insert(b)->insert(c);
Run Code Online (Sandbox Code Playgroud)
我是这样做的:
#include <iostream>
using namespace std;
class Node {
public:
char letter;
Node* next;
};
class link_list {
private:
Node* head;
public:
link_list() {
head = NULL;
}
link_list* insertNewNode(char item);
};
link_list* link_list::insertNewNode(char item) {
Node* temp;
temp = new Node;
temp->letter = item;
temp->next = head;
head = temp;
return this;
}
int main() {
link_list list;
list.insertNewNode('a')->insertNewNode('b')->insertNewNode('c');
return 0;
} …Run Code Online (Sandbox Code Playgroud)