【二进制】17倍
程序员文章站
2022-05-08 22:54:28
...
在了解做软件开发可能赚很多的钱之后,农夫约翰也开了一家小的软件公司为客户写程序。约翰的第一个任务对他来说看起来相当简单:输入一个数N,然后输出17*N的值。但是现在,客户又变更了一个条件,输入的N是一个二进制数,输出的值也要是二进制表示的。
现在请帮助约翰完成这个任务。
一个二进制表示的数N。
二进制表示的17N。
10110111
110000100111
N的位数在1000位以内
直接模拟就OK了,要加高精
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int xx,a[5010],f[5010],n,u;
string s[510];
void add()
{
int j=0;
int xx=5005;
for (int i=5005; i>=1; --i)
{
f[i]=f[i]+a[xx]+j;
j=f[i]/10;
f[i]=f[i]%10;
--xx;
}
}
void mul()
{
int j=0;
for (int i=5005; i>=1; --i)
{
a[i]=a[i]*2+j;
j=a[i]/10;
a[i]%=10;
}
}
void mul2()
{
int j=0;
for (int i=5005; i>=1; --i)
{
f[i]=f[i]*17+j;
j=f[i]/10;
f[i]%=10;
}
}
bool check()
{
for (int i=1; i<=5005; ++i)
if (f[i]!=0) return true;
return false;
}
void work()
{
xx=0; int j=0;
while (check()==true)
{
a[++xx]=f[5005]%2; j=0;
for (int i=u; i<=5005; ++i)
{
int kk=f[i];
f[i]=(f[i]+j*10)/2;
j=kk%2;
}
}
}
int main()
{
int n=0;
cin>>s[++n];
while (s[n]!="") {
int len=s[n].length();
s[n]=' '+s[n]; a[5005]=1;
for (int i=len; i>=1; --i)
{
if (i!=len) mul();//求是2的多少次方(2^x)
if (s[n][i]=='1') add();//求二进制这个值是多少
}
cin>>s[++n];
}
mul2();
memset(a,0,sizeof(a));
for (int i=1; i<=5005; ++i)
if(f[i]!=0) {u=i; break;}
work();//短除法
for (int i=xx; i>=1; --i)
printf("%d",a[i]);
}