合肥集团网站建设,泰安建设工程信息网,指数基金怎么选,建视频网站需要多少钱题目#xff1a; 翻译#xff1a;
思路#xff1a; 1、由题目可知#xff0c;他想让我们判断交换相邻字符位置后将二进制转为十进制后#xff0c;能否整除2的次方。能整除即输出需要交换的次数#xff0c;不能则输出-1。#xff08;例#xff1a;输入3和010这组数据就…题目 翻译
思路 1、由题目可知他想让我们判断交换相邻字符位置后将二进制转为十进制后能否整除2的次方。能整除即输出需要交换的次数不能则输出-1。例输入3和010这组数据就要判断能否整除2、4、8这三个数。 2、两个子函数一个将字符串转为代表的十进制数另一个进行将相邻字符互换位置。 3、详细见代码中注释。 代码
#includeiostream
#includealgorithm
#includecmath
using namespace std;
int ans 0;
long long judge(string s,int n)//二进制转十进制
{long long sum 0;for (int i 0; i n; i){if (s[i] 1)sum pow(2, i);}return sum;
}
int zhuanhuan(string s)//交换位置
{int a s.find(1,0)//查找第一个1的位置int flag 1;//标记while (flag){if (a s.size() - 1)return 0;//满了if (s[a 1] 0)//前一位为0则交换位置{swap(s[a 1], s[a]);ans;//交换次数加一flag 0;}else//不为零往前一位a;}return 1;
}
int main()
{int n;cin n;//输入数据组数while (n--){string s;ans 0;int t;cin t;//字符个数cin s;//输入字符串reverse(s.begin(), s.end());//翻转字符串int k 1;//整除数从2的一次方开始for (int k 1; k t; k){long long a pow(2, k);//该2的次方int flag 1;while (flag){if (judge(s, t) % a 0)可以整除该2的次方{cout ans ;//输出转化次数break;}flag zhuanhuan(s);//转换一次返回的为0即不能转换了达到最大值}if (flag 0)//输出-1cout -1 ;}cout endl;}
}
结果