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:])