栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

acwing3998. 变成1

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

acwing3998. 变成1

链接:https://www.acwing.com/problem/content/4001/

给定一个二进制数 x,在它变为 1 之前,不断对它进行如下操作:

如果 x 为奇数,则将 x 加 1。
如果 x 为偶数,则将 x 除以 2。
请问,多少次操作后,x 会变为 1。

输入格式
共一行,一个 01 字符串,表示二进制数 x。

输出格式
一个整数,表示所需操作次数。

数据范围
前六个测试点满足,x 的位数不超过 11。
所有测试点满足,x 的首位不为 0,且位数不超过 106。

输入样例1:
1
输出样例1:
0
输入样例2:
1001001
输出样例2:
12
输入样例3:
101110
输出样例3:
8

知识点:高精度,模拟。
代码:

#include 
#include 
#include 
using namespace std;
const int N = 1e6+10;
char str[N];
int num[N];
int main()
{
   scanf("%s",str);
   int n;
   n=strlen(str);
   for(int i=0,j=n-1;i 

代码的思路是通过模拟二进制进位的过程来进行操作,由于题目中规定的两种操作都是确定的,所以可以模拟整个过程。但需要加个优化,否则整体的时间复杂度是n方,会超时。优化的内容是,进位时遇到连续的1,会将其全部变成0,然后将最后一个1的下一位0,变成1,当下一位不是1的话,那么之后的循环是无意义的,可以直接break。重点就是,将整个串看成若干个连续的1组成的部分,再对每个连续的1进行操作。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/330551.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号