欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【二进制】17倍

程序员文章站 2022-05-08 22:54:28
...

LinkLink

SSL 2492

DescriptionDescription

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

InputInput

一个二进制表示的数N。

OutputOutput

二进制表示的17N。

SampleSample InputInput

10110111 

SampleSample OutputOutput

110000100111 

ExplainExplain

N的位数在1000位以内

TrainTrain ofof ThoughtThought

直接模拟就OK了,要加高精

CodeCode

#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]);
} 
相关标签: 二进制