5 条题解

  • 7
    @ 2021-8-9 21:59:46

    我们可以编写一个函数,将一个字符串内的每个字符变成数字存储到数组里(注意数组要开到2000以上)然后循环将数组每两个数字相加之后求余10,得到的结果再相加求余10,最终会剩一个数字,返回该数字即可。

    然后在主函数中我们将两个字符串变量a和b相加(也就是连接字符串ab)放入函数,再将b和a相加放入函数,将得到的两个返回值比较即可。

    我的代码没有用字符串连接,比较麻烦,可以看一下千夜老师的另外一篇题解。

    int bj(string x,string y)
    {
    	memset(t,0,sizeof(t));
    	int l1 = x.length();
    	int l2 = y.length();
    	int l = l1+l2;
    	for(int i=0;i<l1;i++)
    	{
    		t[i] = x[i]-'a';
    	}
    	for(int i=0;i<l2;i++)
    	{
    		t[i+l1] = y[i]-'a';
    	}
    	while(l-->0)
    	{
    		for(int i=0;i<l;i++)
    		{
    			t[i] = (t[i]+t[i+1])%10;
    		}	
    	}
    	return t[0];
    }
    
    int main()
    {
    	cin >> a >> b;
    	cout << max(bj(a,b),bj(b,a));
    	return 0;
    }
    
    • 3
      @ 2023-10-6 11:37:26
      #include <bits/stdc++.h>
      using namespace std;
      string a,b;
      int t[2005];
      int mo(string x,string y){
      	memset(t,0,sizeof(t));//初始化 
      	int x1=x.length();//x的长度 
      	int y1=y.length();//y的长度 
      	int ans=x1+y1;//总长度 
      	for (int i=0;i<x1;i++){
      		t[i]=x[i]-'a';
      	}
      	for (int i=0;i<y1;i++){
      		t[i+x1]=y[i]-'a';//转换成数字 
      	}//也可以字符串拼接再转换 
      	while((ans--)>0){//由于输出的是一个数,所以是>0 
      		for (int i=0;i<ans;i++){
      			t[i]=(t[i]+t[i+1])%10;
      		}
      	}
      	return t[0];
      }
      int main(){
      	cin>>a>>b;
      	cout<<max(mo(a,b),mo(b,a));//两种情况 
      	return 0;
      }
      
      • 3
        @ 2022-8-3 22:26:50

        本代码时间复杂度为O(n^2)
        本题的求法有点类似杨辉三角
        题目中给到的数据是1≤名字长度≤1000,很多人会把数组开到1000*1000,但是要注意有两个名字,所以至少要开到2000*2000(我第一次就是开到了1000*1000QwQ)

        string a, b;
        short ans1[2000][2000], ans2[2000][2000], lenA, lenB, len;
        

        ans1与ans2分别记录两个不同的名字排列所形成的三角形,lenA记录字符串a的长度,lenB同理,len为两个字符串相加的总长度。

        int main(){
            ios::sync_with_stdio(false); // O2优化 输入输出加速
            cin.tie(0);
            cout.tie(0);
            cin >> a;
            lenA = a.length(); // 用变量保存字符串长度(.length()的时间复杂度好像是O(n)来着)
            cin >> b;
            lenB = b.length();
            len = lenA + lenB;
            for (short i = 0; i < lenA; i++) {
                ans1[0][i] = short(a[i] - 'a'); // 打表【ans1】第一行前半部分
            }
            for (short i = 0; i < lenB; i++) {
                ans2[0][i] = short(b[i] - 'a'); // 打表【ans2】第一行前半部分
            }
            for (short i = 0; i < lenB; i++) {
                ans1[0][i + lenA] = short(b[i] - 'a'); // 打表【ans1】第一行后半部分
            } // 这里的for必须写成这种逻辑,不然大概率会出现字符串越界,程序崩溃!
            for (short i = 0; i < lenA; i++) {
                ans2[0][i + lenB] = short(a[i] - 'a'); // 打表【ans2】第一行后半部分
            } // 这里的for必须写成这种逻辑,不然大概率会出现字符串越界,程序崩溃!
            for (short i = 1; i < len; i++) { // 从第二行开始
                for (short j = 0; j < len - i; j++) { // 从第一列开始
                    ans1[i][j] = (ans1[i - 1][j] + ans1[i - 1][j + 1]) % 10; // 依次计算
                    ans2[i][j] = (ans2[i - 1][j] + ans2[i - 1][j + 1]) % 10; // 依次计算
                }
            }
            cout << max(ans1[len - 1][0], ans2[len - 1][0]) << "\n"; // 输出结果
            /*
             * 下面这个被注释掉的代码为调试时的打表,检查输入数据和计算是否有
             * bug用的,感兴趣的同学可以自行取消注释看看打表是什么样子的,递
             * 交的时候记得重新注释掉或者删掉哦。
             */
             
            /*
            for (short i = 0; i < len; i++) {
                for (short j = 0; j < len - i; j++) {
                    cout << ans1[i][j] << " ";
                }
                cout << "\n";
            }
            */
            return 0;
        }
        
        • 0
          @ 2023-10-19 21:48:51

          总体不太难(像我这种菜鸡都能做出来)😄

          string a, b;
          char x[2000];
          int c[2000];
          int find (string a, string b)
          {
              int aa = a.length();
              int bb = b.length();
              int cc = aa + bb;
              for (int i = 0; i < aa; i++)
              {
                  x[i] = a[i];
              }
              for (int i = aa; i < cc; i++)
              {
                  x[i] = b[i - aa];
              }
              for (int i = 0; i < cc; i++)
              {
                  c[i] = x[i] - 'a';
              }
              for (int i = cc; i > 0; i--)
              {
                  for (int j = 0; j < i - 1; j++)
                  {
                      c[j] = (c[j] + c[j + 1]) % 10;
                  }
              }
              return c[0];
          }
          int main()
          {
              cin >> a >> b;
              cout << max(find(a, b), find(b, a));
              return 0;
          }
          
          • -9
            @ 2022-4-24 16:53:48

            写题解请注意

            鼓励大家写题解,但注意题解格式。

            题解一定要有思路解析或代码注释,能否让别人理解你的思路

            也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

            给代码两端加上这个会舒服一些

            ```cpp

            你的代码

            ```

            </span>

            这个点在键盘的左上角tab上面那个键,注意切换输入法

            #include<iostream>
            using namespace std;
            int main()
            {
                int n;
                cin>>n;//这是一个注释
                return 0;
            } 
            

            请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

            抄袭题解一经发现直接取消成绩。

            题解被删除的可能

            1. 代码不符合格式规范
            2. 没有思路讲解或者没有注释,
            3. 无意义的题解

            大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

            • 1

            信息

            ID
            1197
            时间
            1000ms
            内存
            256MiB
            难度
            5
            标签
            递交数
            672
            已通过
            234
            上传者