样例都对,结果一个没对

P1015 [NOIP1999 普及组] 回文数

ZSYhaouuan @ 2024-07-28 13:29:14

#include<bits/stdc++.h>
using namespace std;
int ans=0,x;
string n;
int f1(int x){
    int t=0;
    while(x!=0){
        t=t*10+x%10;
        x/=10;
    }
    return t;
}
int f2(int x,string s){
    int len=s.size(),cnt=0;
    for(int i=0;i<len;i++){
        if(s[i]>='A'&&s[i]<='F'){
            int t=s[i]-'A'+10;
            cnt+=t;
        }else{
            int t=s[i]-'0';
            cnt+=pow(x,len-i-1)*t;
        }
    }
    return cnt;
}
int main(){
    cin>>x>>n;
    int m=f2(x,n);
    for(int i=1;i<=30;i++){
        if(f1(m)==m){
            cout<<"STEP="<<i-1;
            return 0;
        }else{
            m=f1(m)+m;
        }
    }
    cout<<"Impossible!";
    return 0;
}

by 120629q @ 2024-07-30 15:00:25

#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; //完美结束
}

by 120629q @ 2024-07-30 15:02:25

试试我的其实我也不知道对不对


by ZSYhaouuan @ 2024-07-30 22:25:19

@120629q 过了。但这需要70多行吗?。。。


by 120629q @ 2024-07-31 14:20:43

我是觉的好看

****


|