• 杭电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++水平一般,所以代码并不是很规范,请原谅。

  • 相关阅读:
    06文件操作
    内核层和用户层通讯的三种方式
    中断门
    工业控制网络安全技术与实践
    前言-anton安卓逆向的入门(零)
    前言与目录-白帽子讲Web安全(零)
    前言与目录-IDA Pro权威指南(零)
    前言与目录-C/C++常用算法手册(零)
    前言与目录-java常用算法手册(零)
    《想你的时候我和自己靠得很近》
  • 原文地址:https://www.cnblogs.com/henuliulei/p/9743592.html
Copyright © 2020-2023  润新知