4 条题解

  • 3
    @ 2023-10-8 19:56:10

    写在前面 这道题不难,我用这道题学习了一下字符串拼接和字符串加法进位,其实还想学习一下atoi函数和stoi函数,后来也没用。我这道题有很多细节在一开始并没有注意,导致出现了很多问题,想把代码分享出来,希望之后的同学注意细节。

    #include <math.h>
    #include <string.h>
    
    #include <iostream>
    
    int main() {
      int T = 0;
      std::cin >> T;
      for (int i = 0; i < T; i++) {
        int jinWei = 0;  // 这里只可能是0或1其他的情况都是错的
    
        std::string count1;
        std::string count2;
        std::string result;
        std::cin >> count1 >> count2;
    
        std::string result1 = count1;//16 17两行是用来保存输入的字符串不被前导零覆盖,输出使用
        std::string result2 = count2;
        int length1 = std::max(count1.length(), count2.length());
    
        // 22 到 32 部分是用来比较两字符串长度并且变为等长
        int lenMin = count1.length();
        int lenMax = count2.length();
        std::string m = "";
        for (int j = 0; j < std::abs(lenMax - lenMin); j++) {
          m = m + "0";
        }
        if (count1.length() > count2.length()) {
          count2 = m + count2;
        } else if (count1.length() < count2.length()) {
          count1 = m + count1;
        }
    
        for (int j = length1 - 1; j >= 0; j--) {
          int tempstr;
          int temp1 = 0;
          int temp2 = 0;
          temp1 = count1[j] - '0';
          temp2 = count2[j] - '0';
          int sum = temp1 + temp2 + jinWei;
          if (sum >= 10) {
            jinWei = 1;
          } else {
            jinWei = 0;
          }
          int yuShu = (sum) % 10;
          tempstr = yuShu;
          result = std::to_string(tempstr) + result;
        }
    
        std::cout << "Case " << i + 1 << ":" << std::endl;
        std::cout << result1 << " + " << result2 << " = ";
        if (jinWei == 1) {
          std::cout << "1";
        }
        std::cout << result << std::endl;
      }
    }
    
    • 0
      @ 2025-8-20 0:52:16
      #include <bits/stdc++.h>
      using namespace std;
      const int N = 1010;
      
      int a[N], b[N];
      int al, bl;
      
      void add(int a[], int &al, int b[], int &bl) {
      int t = 0;
      al = max(al, bl);
      for (int i = 0; i < al; i++) {
      t += a[i] + b[i];
      a[i] = t % 10;
      t /= 10;
      }
      if (t) a[al++] = 1;
      if(al > 1 && a[al - 1] == 0) al--;
      }//到底是改用while还是if有待考究
      
      int main() {
      int T;
      cin >> T;
      for (int k = 1; k <= T; k++) {
      memset(a, 0, sizeof(a));
      memset(b, 0, sizeof(b));
      al = 0;
      bl = 0;
      
      string x, y;
      cin >> x >> y;
      
      for (int i = x.size() - 1; i >= 0; i--) a[al++] = x[i] - '0';
      for (int i = y.size() - 1; i >= 0; i--) b[bl++] = y[i] - '0';
      
      // 执行加法
      add(a, al, b, bl);
      cout << "Case " << k << ":" << endl;
      cout << x << " + " << y << " = ";
      for (int i = al - 1; i >= 0; i--) cout << a[i];
      cout << endl;
      if (k < T) cout << endl;
      
      }
      return 0;
      }
      

      有大佬用一个数组就可以存储,用空间换时间,但是我比较笨,不会简便。

      • 0
        @ 2025-5-2 9:05:11

        感谢Python的无限大int😄

        for i in range(int(input())):
            print("Case %d:"%(i+1))
            a,b=input().split()
            print(a+" + "+b+" = ",end='')
            print(int(a)+int(b))
        
        • 0
          @ 2024-11-27 20:40:47
          可能有点写的不太好,有错误可指出
          #include<stdio.h>
          #include<string.h>
          
          void jinwei(char *num1,char *num2,char*sum)
          {
          	//为了方便进行进位加法,先将字符串进行反转
          
          	//反转之前先计算长度
          	int len1 = strlen(num1);
          	int len2 = strlen(num2);
          
          	//对数组num1进行反转
          	for(int i=0;i<len1/2;i++)
          	{
          		char temp = num1[i];
          		num1[i] = num1[len1-1-i];
          		num1[len1-i-1] = temp;
          	}
          	//对数组num2进行反转
          
          	for(int i=0;i<len2/2;i++)
          	{
          		char temp = num2[i];
          		num2[i] = num2[len2-i-1];
          		num2[len2-i-1] = temp;
          	}
          
          	//下面进行加法进位
          
          	//加法之前先算出和的数的大概位数
          	int maxlen = (len1 > len2)?len1:len2;
          	int yushu = 0;
          	for(int i=0;i<maxlen;i++)
          	{
          		int dight1 = (i<len1)?num1[i] - '0':0;
          		int dight2 = (i<len2)?num2[i] - '0':0;
          
          		int su = dight1 + dight2 + yushu;
          		sum[i] = (su%10) + '0';
          		yushu = su/10;
          	}
          	if(yushu>0)
          	{
          		sum[maxlen] = yushu + '0';
          		maxlen++;
          	}
          
          	//把结果字符串进行反转
          	for(int i=0;i<maxlen/2;i++)
          	{
          		char temp = sum[i];
          		sum[i] = sum[maxlen-i-1];
          		sum[maxlen-i-1] = temp;
          	}
          		sum[maxlen] = '\0';
          }
          int main()
          {
          	int n;
          	scanf("%d",&n);
          	int x = 1;
          	while(n--)
          	{
          		char a[1000] = {0};
          		char b[1000] = {0};
          		char result[1000] = {0};
          		scanf("%s",a);
          		scanf("%s",b);
          		char c[1000] = {0};
          		char d[1000] = {0};
          		int len1 = strlen(a);
          		int len2 = strlen(b);
          		strcpy(c,a);
          		strcpy(d,b);
          		c[len1] = '\0';
          		d[len2] = '\0';
          		jinwei(a,b,result);
          		printf("Case %d:\n",x);
          		x++;
          		printf("%s + %s = %s\n",c,d,result);
          	}
          }
          
          • 1

          信息

          ID
          165
          时间
          3000ms
          内存
          128MiB
          难度
          8
          标签
          (无)
          递交数
          1470
          已通过
          175
          上传者