杭电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++水平一般,所以代码并不是很规范,请原谅。
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。