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;
}