2 条题解

  • 0
    @ 2025-6-21 16:46:28
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    string m;
    // 存一个高精度的数 
    int len, d[205]; 
    // 颠倒相加 
    void diandaoxiangjia(){
    	for(int i=0,j=len-1; i<=j; i++,j--){
    		int now = d[i]+d[j];
    		d[i] = now;
    		d[j] = now;
    	}
    	for(int i=0;i<=len-2;i++)
    	{
    		d[i+1]+=d[i]/n;
    		d[i]%=n;
    	}
    	while(d[len-1]>=n)
    	{
    		d[len]=d[len-1]/n;
    		d[len-1]%=n;
    		len++;
    	}
    }
    // 是否回文 
    bool shifouhuiwen(){
    	for(int i=0;i<len;i++)
    		if(d[i]!=d[len-1-i])
    			return false;
    	return true;
    }
    int main(){
    	cin>>n>>m;
    	len=m.size();
    	for(int i=0;i<len;i++){
    		if('0'<=m[len-1-i] && m[len-1-i]<='9')
    			d[i] = m[len-1-i]-'0';
    		else
    			d[i] = m[len-1-i]-'A'+10;
    	}
    	if(shifouhuiwen())
    	{
    		cout<<"STEP=0\n";
    		return 0;
    	}
    	for(int i=1;i<=29;i++){
    		diandaoxiangjia();
    		if(shifouhuiwen())
    		{
    			cout<<"STEP="<<i<<"\n";
    			return 0;
    		}
    	} 
    	cout<<"Impossible!";
    	return 0;
    }
    
    
    • 0
      @ 2025-4-4 9:09:27
      #include <bits/stdc++.h>
      using namespace std;
      const int LEN = 300 + 30;
      int N; // 进制数
      string M;
      int step;
      
      int mLen;
      int m[LEN + 5];
      
      // 检查 m[0]~m[mLen-1] 是否回文
      bool check()
      {
          for (int i = 0, j = mLen - 1; i < j; i++, j--)
              if (m[i] != m[j])
                  return false;
          return true;
      }
      
      int main()
      {
          cin >> N;
          cin >> M;
      
          // M 翻转并转换为对应的数字
          mLen = M.size();
          for (int i = 0; i < mLen; i++)
          {
              if ('0' <= M[i] && M[i] <= '9')
                  m[mLen - i - 1] = M[i] - '0';
              if ('A' <= M[i] && M[i] <= 'F')
                  m[mLen - i - 1] = M[i] - 'A' + 10;
          }
      
          // 循环执行直到回文或者 30 步为止
          for (step = 0; step < 30 && !check(); step++)
          {
              // 颠倒相加
              for (int i = 0, j = mLen - 1; i <= j; i++, j--)
              {
                  int now = m[i] + m[j];
                  m[i] = m[j] = now;
              }
              // 进位
              for (int j = 0; j < mLen - 1; j++)
              {
                  m[j + 1] += m[j] / N;
                  m[j] %= N;
              }
              // 最高位尝试扩展
              while (m[mLen - 1] > N - 1)
              {
                  m[mLen] = m[mLen - 1] / N;
                  m[mLen - 1] %= N;
                  mLen++;
              }
          }
      
          // 输出
          if (step >= 30)
              cout << "Impossible!";
          else
              cout << "STEP=" << step;
          return 0;
      }
      
      • 1

      信息

      ID
      13416
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      22
      已通过
      6
      上传者