17倍

17倍

题目

在了解做软件开发可能赚很多的钱之后,农夫约翰也开了一家小的软件公司为客户写程序。约翰的第一个任务对他来说看起来相当简单:输入一个数N,然后输出17*N的值。但是现在,客户又变更了一个条件,输入的N是一个二进制数,输出的值也要是二进制表示的。
现在请帮助约翰完成这个任务。

输入

一个二进制表示的数N。

输出

二进制表示的17N。

输入样例

10110111 

输出样例

110000100111 

样例说明

10110111相当于十进制的183,于是183*17=3111,二进制形式是110000100111。

数据范围

N的位数不超过1000位。

思路

这道题就是直接模拟。
我们可以吧17转换成2进制得(1001)2
那么用(1001)2乘所给的二进制数其实就是这个二进制数加这个二进制数前面多3个0。
大家看文字可能很蒙,那我们来举个例子吧:
(1001)2×(10011)2=(10011)2+(10011000)2=(10101011)2

那么这样子就可以求出乘后的二进制数了。
不过有一点要注意的就是,要用高精乘的方式来做。

代码

#include<cstdio>
#include<cstring>
using namespace std;
int aa[1001],a[1010],ans[1010],l,j;
char c;
int main()
{
	memset(a,0,sizeof(a));//初始化
	c=getchar();//读入
	while (c!='\n')
	{
		aa[++l]=c-48;//标记
		c=getchar();//读入
	}
	for (int i=l;i>=0;i--)
	a[l-i]=aa[i];//倒序储存
	memset(aa,0,sizeof(aa));//初始化
	for (int i=4;i<=l+4;i++)
	aa[i]=a[i-4];//复制这个倒叙二进制数(但是前面要多3个0)
	for (int i=0;i<=l+10;i++)//高精加
	{
		ans[i]=a[i]+aa[i]+j;
		j=ans[i]/2;
		ans[i]%=2;
		if (i>l+4&&!j) break;
	}
	int ll=l+5;
	while (ans[ll]==0) ll--;//去除前缀0
	for (int i=ll;i>=0;i--)
	printf("%d",ans[i]);//倒叙输出
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值