[关闭]
@lychee123 2017-03-19T11:51:11.000000Z 字数 2267 阅读 1100

HDU-2424:Gary’s Calculator(算式计算加法和乘法)

高精度


给你一个只含 + 和 * 的式子,计算出结果

多组输入
每组有两行输入:第一行输入要输入的字符个数n,第二行输入n个字符(输入只有数字和‘+’‘ *’三种字符)

3
100 + 600
3
20 * 4
2
500 +
5
20 + 300 * 20

Case 1: 700
Case 2: 80
Case 3: Invalid Expression!
Case 4: 6020

栈有后进先出的特点,在输入的时候判断该字符串是否是该出现的字符串,如果是那么输入合法继续进行操作,否则标记下来。当出现数字且还未出现乘号的时候该数字进栈,当出现数字且上一个符号是乘号,则栈顶元素与刚输入的数字相乘,将栈顶元素弹出,再将乘法所得结果压入栈顶,依次处理完所有的乘法,将栈内的所有数字相加,而且c++自带栈的一系列函数,所以运用栈可以更方便的计算。

由于c++学得太烂了所以很多基本的知识都不知道 比如说string 必须用cin输入 改了老半天
数组开得比较多的时候一定要注意清空问题(由于清空问题wrong了一发,香菇)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string mult(string s1,string s2)///高精度乘法函数
  4. {
  5. int i,j,l,a[1111],b[1111],s[2222];
  6. char ans[2222];
  7. int l1=s1.length();
  8. int l2=s2.length();
  9. memset(ans,0,sizeof(ans));
  10. memset(a,0,sizeof(a));
  11. memset(b,0,sizeof(b));
  12. memset(s,0,sizeof(s));
  13. for(i=0;i<l1;i++)
  14. a[l1-i-1]=s1[i]-'0';
  15. for(i=0;i<l2;i++)
  16. b[l2-i-1]=s2[i]-'0';
  17. for(i=0;i<l1;i++)
  18. {
  19. for(j=0;j<l2;j++)
  20. {
  21. s[i+j]+=a[i]*b[j];
  22. if(s[i+j]>=10)
  23. {
  24. s[i+j+1]+=s[i+j]/10;
  25. s[i+j]%=10;
  26. }
  27. }
  28. }
  29. l=l1+l2;
  30. for(i=l-1;i>=1;i--)
  31. {
  32. if(s[i]!=0)
  33. break;
  34. else
  35. l--;
  36. }
  37. for(i=l-1,j=0;i>=0;i--,j++)
  38. ans[j]=s[i]+'0';
  39. return ans;
  40. }
  41. string add(string s1,string s2)///高精度加法函数
  42. {
  43. int l1,l2,a[2222],b[2222],sum[2222],i,l,j;
  44. char ans[2222];
  45. l1=s1.length();
  46. l2=s2.length();
  47. memset(a,0,sizeof(a));
  48. memset(b,0,sizeof(b));
  49. memset(sum,0,sizeof(sum));
  50. memset(ans,0,sizeof(ans));
  51. for(i=0;i<l1;i++)
  52. a[l1-i-1]=s1[i]-'0';
  53. for(i=0;i<l2;i++)
  54. b[l2-i-1]=s2[i]-'0';
  55. l=(l1>l2)?l1:l2;
  56. for(i=0;i<l;i++)
  57. {
  58. sum[i]+=a[i]+b[i];
  59. if(sum[i]>=10)
  60. {
  61. sum[i]-=10;
  62. sum[i+1]++;
  63. }
  64. }
  65. if(sum[l]>0)
  66. l++;
  67. for(i=l;i>0;i--)
  68. {
  69. if(sum[i]==0)
  70. l--;
  71. else
  72. break;
  73. }
  74. for(i=l,j=0;i>=0;i--,j++)
  75. ans[j]=sum[i]+'0';
  76. return ans;
  77. }
  78. int main()
  79. {
  80. int i,j,k,n,t=0,flag=0,flag1=0;
  81. string a;
  82. string ans;
  83. while(~scanf("%d",&n))
  84. {
  85. stack<string>s;///string型栈的定义
  86. t++;
  87. flag=0;///输入是否合法的标记
  88. flag1=0;///是否遇乘法的标记
  89. ans.clear();///string的清空
  90. if(n%2==0)///当输入偶数个字符时一定是不合法的输入
  91. {
  92. while(n--)
  93. cin>>a;
  94. cout<<"Case "<<t<<": "<<"Invalid Expression!"<<endl;
  95. continue;
  96. }
  97. for(i=1;i<=n;i++)
  98. {
  99. cin>>a;
  100. if(i%2==1&&flag==0)///当是奇数位置且目前为止输入合法
  101. {
  102. if(a[0]!='+'&&a[0]!='*')///出现数字
  103. {
  104. if(flag1==0)///还未出现乘号
  105. s.push(a);///入栈
  106. else
  107. {
  108. flag1=0;
  109. string ss=mult(s.top(),a);///乘法运算
  110. s.pop();///栈顶弹出
  111. s.push(ss);///乘积入栈
  112. }
  113. }
  114. else
  115. flag=1;///不合法的输入
  116. }
  117. if(i%2==0&&flag==0)
  118. {
  119. if(a[0]=='*')
  120. {
  121. flag1=1;///表示遇到了乘法
  122. }
  123. else if(a[0]!='+')
  124. flag=1;
  125. }
  126. }
  127. if(flag==1)
  128. {
  129. cout<<"Case "<<t<<": "<<"Invalid Expression!"<<endl;
  130. continue;
  131. }
  132. while(!s.empty())
  133. {
  134. ans=add(s.top(),ans);
  135. s.pop();
  136. }
  137. cout<<"Case "<<t<<": "<<ans<<endl;
  138. }
  139. return 0;
  140. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注