25分求调

P1015 [NOIP1999 普及组] 回文数

gejiaqia @ 2024-07-19 13:02:18

rt

#include<bits/stdc++.h>
using namespace std;
int n;
string m;
string addm;//翻转的字符串 
int step=0; 
int k[505],b[505],c[505];//k是s1转的数字,b是s2转的数字 
string add(string s1,string s2){
    memset(k,0,sizeof k);
    memset(b,0,sizeof b);
    memset(c,0,sizeof c);//求和数组 
    int l1=s1.size();
    int l2=s2.size();
    int l3=max(l1,l2);//和数组c的长度 
    for(int i=l1,j=0;i>=0;i--,j++){//反存 
        if(s1[i]>='0'&&s1[i]<='9'){
            k[j]=s1[i]-'0';
        }else{
            k[j]=s1[i]-55;
        }
    }
    for(int i=l2,j=0;i>=0;i--,j++){//反存 
        if(s2[i]>='0'&&s2[i]<='9'){
            b[j]=s2[i]-'0';
        }else{
            b[j]=s2[i]-55;
        }
    }
    int t=0;
    for(int i=0;i<l3;i++){
        c[i]=k[i]+b[i]+t;
        t=c[i]/n;
        c[i]=c[i]%n;
    }
    if(t){
        c[l3]=1;
        l3++;
    }
    string s3="";
    for(int i=l3;i>=0;i--){
        if(c[i]>='0'&&c[i]<='9'){
            s3+=c[i]+'0';
        }else{
            s3+=char(c[i]+55);
        }
    }
    return s3;
}
int main(){
    cin>>n;
    cin>>m;
    string m2=m;
    reverse(m.begin(),m.end());//颠倒字符串
    if(m==m2){
        cout<<"STEP"<<"="<<0;
    } 
    while(1){//无限循环 
        addm=add(m,m2);//存一下结果 
        step++;//步数增加 
        string addm2=addm;//存数字 
        reverse(addm.begin(),addm.end());//颠倒 
        if(step>30||addm==addm2){//看是不是回文数 
            break;
        }
        m=addm;//继续加 
        m2=addm2;//改变一下 
    }
    if(step>30)puts("Impossible!");
    else cout<<"STEP="<<step;
    return 0;
}

by beigongbaishan @ 2024-07-19 13:12:29

```cpp #include<bits/stdc++.h> using namespace std; int a[1005],la; bool huiwen(){ for(int i=0;i<=la/2;i++) if(a[i]!=a[la-i-1])return false; return true; } int main(){ int n; string s1; cin>>n>>s1; la=s1.size(); for(int i=0;i<la;i++){ if(s1[i]>='0'&&s1[i]<='9')a[i]=s1[la-i-1]-'0'; else a[i]=(s1[la-i-1]-'A')+10; } if(huiwen()==true){ cout<<'0'; return 0; } for(int i=1;i<=30;i++){ for(int j=0;j<=la/2;j++)a[j]+=a[la-j-1]; for(int j=la/2;j<la;j++)a[j]=a[la-j-1]; for(int j=0;j<la;j++){ if(a[j]>=n){ a[j+1]++; a[j]-=n; if(j==la-1)la++; } } if(huiwen()){ cout<<"STEP="<<i; return 0; } } cout<<"Impossible!"; return 0; } ``` 求关~

by ptxy2352010111 @ 2024-07-22 20:11:05

用高精度


by 120629q @ 2024-07-30 15:11:59

#include <bits/stdc++.h>
using namespace std;//大家都懂就不说了
int n;//题目中的N进制
string m;//题目中M有100位!!!必须用字符串(不太懂楼下的dalao如何做的用unsigned long long过的???求指导qwq)
int ans;
int p;
bool hw(string st)//判断是否回文
{
    int ln=st.size(); 
    for(int i=0;i<ln/2;i++)
        if(st[i]!=st[ln-1-i])return 0;//若不了解这条公式,大家可以验证一下
    return 1;
}
int zhuan(char x)//将字符转成数字
{
    if(x>='0'&&x<='9')return int(x-48);
    else//以下判断是因为有16进制
    {
        if(x=='A')return 10;
        if(x=='B')return 11;
        if(x=='C')return 12;
        if(x=='D')return 13;
        if(x=='E')return 14;
        if(x=='F')return 15;
    }
}
char zhuan_h(int x)//将数字转回字符
{
    if(x>=0&&x<=9)return char(x+48);
    else//和上面一样
    {
        if(x==10)return char('A');
        if(x==11)return char('B');
        if(x==12)return char('C');
        if(x==13)return char('D');
        if(x==14)return char('E');
        if(x==15)return char('F');
    }
}
string bian(string a,string b)//做加法
{
    for(int i=0;i<b.size()/2;i++)//进行反转(楼下dalao用reverse(a.begin(), a.end());也是可行的,佩服)
        swap(b[i],b[b.size()-1-i]);
    string c="";//用来记录等会的和
    int jw=0,aw=0,bw=0,cw=0;
    for(int i=a.size()-1;i>=0;i--)
    {
        aw=zhuan(a[i]);//将a[i]转成数字
        bw=zhuan(b[i]);//将b[i]转成数字
        cw=(aw+bw+jw)%n;//看c字符串这一位是几
        if(aw+bw+jw>=n)jw=1;//判断是否进位
        else jw=0;
        c=zhuan_h(cw)+c;//将这一位的数转回字符放在c字符串,注意:要放在在前面,因为是倒着算的
    }
    if(jw==1)c='1'+c;//千万不要忘记了最后一位还会进位
    return c;//返回得出的结果
} 
int main()
{
    cin>>n;
    cin>>m;
    p=hw(m);//判断是否回文
    while(p==0)
    {
        if(ans>30)//如果方案数>30输出“Impossible!”
        {
            cout<<"Impossible!";
            exit(0);
        }
        ans++;//方案数累加
        m=bian(m,m);//将M进行做加法
        p=hw(m);//别忘了判断回文
    }
    cout<<"STEP="<<ans;//输出结果
    return 0; //完美结束
}

其实我是乱写但是对了 哈哈


|