字符串毕竟是个变量,比数字运算复杂也是可以理解的吧

众所周知,字符串是一种独特的数据类型,而且与各种算法都几乎百搭,例如排序、高精、解码、进制......

今天讲讲几个字符串玩法

1.“按字典序排序”是个啥?

不少题里面都出现过这个名词,我敢保证很少有人第一次看到这个词不是懵的

好好想想,是不是学过个东西叫ASCII码?字典序就是按照两个字符串中首个不同字符的ASCII码值的顺序进行的排序 比如在C++眼里"azzz"<"baaa",因为前者的与后者的首个不同的字符中,前者的更大

而且C++特别贴心,两个字符串可以直接判断字典序大小,所以你就可以做出下面这道题:

输入一个nn,再输入nn个数字字符串,输出这几个数字字符串能拼成的最大数字

参考答案:

#include<bits/stdc++.h>
using namespace std;
bool cmp(string x,string y){
    return x+y>y+x;
}
string a[1001];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        cout<<a[i];
    }
}

2.顺带提一下高精度

高精度,简单来说就是把输入的超长数字当成字符串,再把每一个数位单独计算,使运算范围更大,以高精加为例

#include<bits/stdc++.h>
using namespace std;
int aa[100001];
int bb[100001];
int cc[100002]; 
int main(){
	string a,b;
	cin>>a>>b; //把数字当成字符串输入
	int len=max(a.length(),b.length());
	for(int i=a.length()-1;i>=0;i--){
		aa[a.length()-i]=a[i]-'0';  //按照数位进行转换
	}
	for(int i=b.length()-1;i>=0;i--){
		bb[b.length()-i]=b[i]-'0';
	}
	for(int i=1;i<=len;i++){
		cc[i]+=aa[i]+bb[i]; //cc存加和
		cc[i+1]=cc[i]/10; //考虑进位情况
		cc[i]%=10;  //同样是进位
	}
	if(cc[len+1]!=0){
		len++; //最后一个进位特判
	}
	for(int i=len;i>=1;i--){
		cout<<cc[i]; //因为转换、运算都是反向的,输出也反向
	}
	return 0;
}

OK,今天先码到这,剩下的下期再聊

4 条评论

  • @ 2024-7-1 20:54:27

    推荐一个十分好用の函数 reverse(<开始下标>,<结束下标>)

    • @ 2024-7-1 20:55:29

      string a; 通常reverse(a.begin(),a.end()); //翻转字符串顺序

    • @ 2024-7-2 6:21:50

      加上一个小swap(<变量1>,<变量2>) //交换两个变量的值

    • @ 2024-7-2 6:24:13
      #include <bits/stdc++.h>
      using namespace std;
      string a, b, c;
      
      int main()
      {
          // Plese write your code in here , thak you so much!
          cin >> a >> b;
          reverse(a.begin(), a.end()) , reverse(b.begin(), b.end());
          if (a.length() < b.length()) swap(a, b);
          int s, y = 0;
          for (int i = 0; i < b.length(); i++)
          {
              s = a[i] - '0' + b[i] - '0' + y;
              y = s / 10;
              c += s % 10 + '0';
          }
          for (int i = b.length(); i < a.length(); i++)
          {
              s = a[i] - '0' + y;
              y = s / 10;
              c += s % 10 + '0';
          }
          if (y) c += y + '0';
          reverse(c.begin(), c.end()) , cout << c;
          return 0;
      }   
      
  • @ 2024-2-5 21:31:51

    vocal

    • @ 2024-2-5 21:31:12

      啊?

      • @ 2024-2-1 16:20:41

        vocal

        • 1