FZU-Problem 2294 Uint47 calculator
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2294
题意:按照所给负号进行赋值、加、减乘、除和取余的操作。
解题思路:用map来存储字符串与值之间的对应关系。
ll 只能存64位,对于所给的六种运算,只有乘法有可能溢出。故对乘法采用快速乘取模的方法。将乘法变成加法,这样就不会溢出了。
AC代码:
1 #include <iostream> 2 #include <map> 3 #include <algorithm> 4 #include <string> 5 using namespace std; 6 typedef unsigned long long ull; 7 ull mod = 1LL << 47;//2的47次方 8 map<string,ull>m; 9 int main() 10 { 11 ull d ; 12 string a,b,s; 13 while(cin>>s) 14 { 15 if(s=="def") 16 { 17 cin>>a>>d; 18 m[a]=(d+mod)%mod; 19 } 20 else if(s=="add") 21 { 22 cin>>a>>b; 23 m[a]=(m[a]+m[b])%mod; 24 } 25 else if(s=="sub") 26 { 27 cin>>a>>b; 28 m[a]=(m[a]-m[b])%mod; 29 } 30 else if(s=="mul") 31 { 32 cin>>a>>b; 33 m[a]=(m[a]*m[b])%mod; 34 } 35 else if(s=="div") 36 { 37 cin>>a>>b; 38 m[a]=m[a]/m[b]; 39 } 40 else 41 { 42 cin>>a>>b; 43 m[a]=m[a]%m[b]; 44 } 45 cout<<a<<" = "<<m[a]<<endl; 46 } 47 }