AcWing 每日一题 2022/5/5【2022. 倍数 17】

AcWing 每日一题 2022/5/5【2022. 倍数 17】

在意识到软件开发有很多钱可赚之后,农夫约翰开办了一家小型企业,为当地农业行业的客户编写简短的程序。

他的第一个编程任务对他来说似乎非常简单:他的客户希望他编写一个程序,该程序将数字 N 作为输入,并将 17×N 作为输出。

约翰刚刚写完这个简单的程序,他的客户就惊慌失措的给他打电话,告诉他输入和输出都必须用二进制数字表示,而且这些数字可能很大。

请帮助约翰完成他的编程任务。

给定一个用二进制表示并且不超过 1000 位的输入数字 N,输出二进制表示下的 17×N。

输入格式
一个不超过 1000 位的二进制数字 N。

输出格式
输出二进制表示下的 17×N。

输入样例:

10110111

输出样例:

110000100111

样例解释
给定数字 10110111 在十进制表示下为 183。

183×17=3111,在二进制表示下为 110000100111。

题目分析

这道题目用 py 好像可以一行代码解决…
用 C++ 的话,就是模板高精度乘法(二进制)

C++

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<sstream>

#define x first
#define y second

using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 100000;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;

int gcd(int a, int b){
    
    return b ? gcd(b, a % b) : a;}

vector<int> mul(vector<int> &a,int b)
{
    
    
	// 存储计算后的数据
	vector<int>c;
	// t 表示进位
	int t=0;
	for(int i=0;i<a.size() || t;i++){
    
    
		// t = t + a [ i ] * b;
		if(i < a.size()) t=a[i]*b+t;
		c.push_back(t%2);
		t/=2;
	}
	// 将最后的计算结果放入
	if(t!=0) c.push_back(t);
	// 去除前导零
	while(c.size()!=1&&c.back()==0) c.pop_back(); 
	return c;
}

int main()
{
    
    
	string a;
	cin >> a;
	vector<int> v;
	for(int i = a.size() - 1; i >= 0; i -- ) v.push_back(a[i] - '0');
	vector<int> ans = mul(v, 17);
	for(int i = ans.size() - 1; i >= 0; i -- ) cout << ans[i];
	return 0;
}




python

print(bin(int(str(input()),2) * 17)[2:])

猜你喜欢

转载自blog.csdn.net/qq_52354698/article/details/124620388