杭电1002_A + B Problem II

这是该题的链接http://acm.hdu.edu.cn/showproblem.php?pid=1002

具体的题的内容就不过多描述了,想必你已经知道了,当我看完这道题后就知道咋写了,可是这道题从开始写到最后accept却花了我好长时间。

先描述一下我的思路,当我看到第二个测试数据后就知道用可以表示范围最大的unsigned long long int 也是无法表示的,之前刷蓝桥杯里面的题,遇到过这种题

因为我对java熟悉一下,所以可以使用BigDecimal解决,或者用数组.所以我果断采用了数组,就是先把输入的数(字符串)存入两个数组里面,每个元素代表一位

,然后反转,这样可以先个位数相加,最后再把结果反转过来即可,由于写算法从java转c++不就,所以c++很多函数还不熟,还有这道题的一些细节等因素耽误了我一些时间。

不过最终成功accept;

下面是具体的代码。

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 char arr2[1005]={'0'};//保存输入的第一个字符串
 5 char arr3[1005]={'0'};//保存输入的第二个字符串
 6 //声明的数组能放在main()之外就尽量放在main()之外,可以减少一些不常见的错误
 7 int main()
 8 {
 9 
10 int a ;
11 cin >>a;
12 int k=1;//输出时用来标记次序
13 int s1=a;//保存a值
14 string a1,a2;
15 string arr1[a];//最终的和,
16 while(a--){
17 arr2[1000]={0};
18 arr3[1000]={0};
19 cin >> a1 >> a2;
20 reverse(a1.begin(),a1.end());//加数反转方便先从个位相加
21 reverse(a2.begin(),a2.end());
22 
23 strcpy(arr2,a1.c_str());
24 strcpy(arr3,a2.c_str());//字符串变字符数组方便保存
25 
26 int ml=max(a1.length(),a2.length());//长度较大的加数
27 int mll=min(a1.length(),a2.length());//长度较小的加数
28 int arr4[ml+1]={0};
29 int flag=0;
30 for(int i=0;i<ml;i++){
31 if(i<mll || a1.length()==a2.length()){
32 
33 arr4[i]=(((int)arr2[i]-48)+((int)arr3[i]-48)+flag)%10;//对应位相加
34 flag=(((int)arr2[i]-48)+((int)arr3[i]-48)+flag)/10;//是否进位保存在flag里面
35 }
36 if(i>=mll && a1.length()>a2.length()){
37 arr4[i]=(((int)arr2[i]-48)+flag)%10;//48是保证char到int相互转变代表的数字不变
38 flag=(((int)arr2[i]-48)+flag)/10;
39 }
40 if(i>=mll && a2.length()>a1.length()){
41 arr4[i]=(((int)arr3[i]-48)+flag)%10;
42 flag=(((int)arr3[i]-48)+flag)/10;
43 }
44 if(i==ml-1 && flag==1){//确定最高位是否为进位得到的1
45 arr4[i+1]=1;
46 }
47 
48 }
49 
50 
51 if(arr4[ml]==0){//最高位为0则不输出最高位,
52 reverse(arr4,arr4+(ml+1));
53 for(int i=1;i<ml+1;i++){
54 arr1[a]+=((char)(arr4[i]+48));
55 }
56 }
57 else{
58 reverse(arr4,arr4+(ml+1));
59 for(int i=0;i<ml+1;i++){
60 arr1[a]+=((char)(arr4[i]+48));
61 }
62 }
63 reverse(a1.begin(),a1.end());
64 reverse(a2.begin(),a2.end());//再此反转得到最终结果
65 cout <<"Case " <<k++<<":" << endl;
66 cout <<a1 <<" + " <<a2<<" = " << arr1[a] << endl;
67 if(a!=0){
68 cout << endl;
69 }
70 
71 }
72 
73 return 0;
74 }

结论:由于自己的c++水平一般,所以代码并不是很规范,请原谅。

原文地址:https://www.cnblogs.com/henuliulei/p/9743592.html