10 条题解
-
14
来点汇编 (
C++
#include <iostream> int main() { int a, b, c1, c2, c3; std::cin >> a >> b; __asm__( "movl %1, %%eax\n\t" "movl %2, %%ebx\n\t" "addl %%ebx, %%eax\n\t" "movl %%eax, %0\n\t" : "=r"(c1) : "r"(a), "r"(b) : "%eax"); __asm__( "movl %1, %%eax\n\t" "movl %2, %%ebx\n\t" "subl %%ebx, %%eax\n\t" "movl %%eax, %0\n\t" : "=r"(c2) : "r"(a), "r"(b) : "%eax"); __asm__( "movl %1, %%eax\n\t" "movl %2, %%ebx\n\t" "imull %%ebx, %%eax\n\t" "movl %%eax, %0\n\t" : "=r"(c3) : "r"(a), "r"(b) : "%eax"); std::cout << c1 << " " << c2 << " " << c3; return 0; }
-
10
草其实这个才是预期解
-
9
C++
#include <iostream> #include <vector> #include <numeric> using namespace std; int main() { int a,b; cin>>a>>b; vector<int> va = {a}; vector<int> vb = {b}; vector<int> vab = {b, a}; vector<int> w(2); int sum = accumulate(vab.begin(), vab.end(), 0); adjacent_difference(vab.begin(), vab.end(), w.begin()); int sub = w[1]; int mul = inner_product(va.begin(), va.end(), vb.begin(), 0); cout<<sum<<' '<<sub<<' '<<mul<<endl; return 0; }
Python
eval
a, b = map(int, input().split()) u = eval(f"{a}{chr(43)}{b}") v = eval(f"{a}{chr(45)}{b}") w = eval(f"{a}{chr(42)}{b}") print(u, v, w)
利用复数搞负数
a, b = map(int, input().split()) cp = complex(0, b) cp = cp.conjugate() ls1 = [a, b] ls2 = [a, int(cp.imag)] ls3 = [a for i in range(b)] print(sum(ls1), sum(ls2), sum(ls3))
find 搞负数 Fraction 搞除法
from fractions import Fraction a, b = map(int, input().split()) f = "".find("233") ls1 = [a, b] ls2 = [a, Fraction(b, f)] mul = Fraction(a, Fraction(1, b)) print(sum(ls1), sum(ls2), mul)
-
7
整活归整活,符合题意的代码还是要写的。
我们都知道
^
运算符是 不进位的加法 ,那么对于加法来说只需要 想个办法模拟进位 即可。对于两个二进制数
1010
和1100
来说,他们的相加即为0001 0110
。都知道
&
运算是全1
为真,那么对于二进制数来说,两个1
不就是进位吗?所以对于第四位上的进位,就可以视为
(1010&1100)<<1
。加法解决了,减法其实就是加上一个数的相反数,计算机里使用的是 补码 ,负数表示为其绝对值 取反再加一 ,如
-1
即为(~1)+1
,恰好可以使用加法解决。乘法本质上是一个数自己加自己数次,使用循环搞定。
……
草,好像不能用
i++
那回头来看二进制乘法
1010 * 1001 -------- 1010 0000 0000 1010 -------- 1011010
发现什么了?
由于二进制只有
1
和0
所以a*b
其实相当于把a
分别左移上b
中每个一所在的位数,最后相加。那你用过快速幂没有?
怎么判断一个二进制数每位有没有一,只需要想个办法把每位的一扔到最后一位(可以通过右移实现),然后再与一即可。
加法的代码:
ll add(ll a,ll b){ return b==0?a:add(a^b,(a&b)<<1); }
减法:
ll reduce(ll a,ll b){ return add(a,add(~b,1)); }
乘法:
ll times(ll a,ll b){ ll re=0; bool A=a<0,B=b<0; a=abs(a),b=abs(b); while(b){ if(b&1) re=add(re,a); a<<=1,b>>=1; } return A^B?add(~re,1):re; }
全代码:
#include<cstdio> #include<cmath> using namespace std; #define ll long long ll add(ll a,ll b){ return b==0?a:add(a^b,(a&b)<<1); } ll reduce(ll a,ll b){ return add(a,add(~b,1)); } ll times(ll a,ll b){ ll re=0; bool A=a<0,B=b<0; a=abs(a),b=abs(b); while(b){ if(b&1) re=add(re,a); a<<=1,b>>=1; } return A^B?add(~re,1):re; } ll a,b; int main() { scanf("%lld%lld",&a,&b); printf("%lld %lld %lld",add(a,b),reduce(a,b),times(a,b)); return 0; }
该用位运算还是要用的。
此处参拜白咕咕神教教主 -
7
我们考虑到这题的数据只有 ,那么,我们考虑小学时老师教你的:
你有 个苹果,然后你又拿到了 个苹果,最后你有 个苹果,所以 那加法就完成了(代码中的
ushort
是unsigned short
)short $(ushort x, ushort y) { return std::string().append(x, '.').append(y, '.').length(); }
那么减法呢?我们知道,,在计算机中,,so,,调用之前写的加法就好:
short _(short x, short y) { y = ~y; return $($(x, reinterpret_cast<ushort&>(y)), 1); }
最后乘法,还是考虑小学的时候老师教你的:
就是 个 相加。
还是用
string
。我们往一个空的string
里面塞 次长度为 的字符串,然后就好了。
但是我们发现一个问题:我们既不能for (int i = 0;i < y;i++)
,也不能while (y--)
。这可怎么办呢?还是用string
。我们每循环一次就往一个初始为空的字符串里塞一个字符,这个串有多长我们就循环了多少次。然后,乘法也被淦掉了:int X(short x, short y) { std::string str = ""; std::string tt = std::string().append(x, ' '); std::string res = ""; while (str.append(1, ' ').length() <= y) { res.append(tt); } return res.length(); }
最后是完整代码:
#include <iostream> #include <string> #define ushort unsigned short short $(ushort x, ushort y) { return std::string().append(x, '.').append(y, '.').length(); } short _(short x, short y) { y = ~y; return $($(x, reinterpret_cast<ushort&>(y)), 1); } int X(short x, short y) { std::string str = ""; std::string tt = std::string().append(x, ' '); std::string res = ""; while (str.append(1, ' ').length() <= y) { res.append(tt); } return res.length(); } int main() { int x, y; std::cin >> x >> y; std::cout << $(x, y) << ' ' << _(x, y) << ' ' << X(x, y) << std::endl; }
-
7
实际上就两种大体做法:
- 使用各大语言的 method 来代替运算符出现
- 使用列表的求和或者长度方法来乱搞
具体实现各显神通
你真写位运算就输了Python
import operator a, b = map(int, input().split()) print("{} {} {}".format(operator.add(a, b), operator.sub(a, b), operator.mul(a, b)))
C++
#include <functional> #include <iostream> using namespace std; int main() { std::ios::sync_with_stdio(false); int a, b; std::cin >> a >> b; std::cout << plus<>{}(a, b) << ' ' << minus<>{}(a, b) << ' ' << multiplies<>{}(a, b) << '\n'; return 0; }
#include <functional> #include <iostream> #include <valarray> using namespace std; int main() { std::ios::sync_with_stdio(false); int a, b; std::cin >> a >> b; std::cout << std::valarray<int>{a,b}.sum() << ' ' << std::valarray<int>{a,std::negate<>{}(b)}.sum() << ' ' << std::valarray<int>(a,b).sum() << '\n'; return 0; }
-
0
C++
根据作者的意思,我们可以导入functional库,使用plus,minus和multiplies函数。 使用方法如下:
#include<functional> #include<iostream> using namespace std; int main(){ int a,b;cin>>a>>b; plus<int> fplus; int x=fplus(a,b); minus<int> fminus; int y=fminus(a,b); multiplies<int> fmultiplies; int z=fmultiplies(a,b); cout<<x<<' '<<y<<' '<<z; return 0; }
至于代码中的fplus,fminus和fmultiplies则是我随便取的名字,可以换成其他的名字,只要合法就行。
- 1
信息
- ID
- 246
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 252
- 已通过
- 58
- 上传者