回文数(信息学奥赛一本通-T1309)
生活随笔
收集整理的這篇文章主要介紹了
回文数(信息学奥赛一本通-T1309)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【題目描述】
若一個數(shù)(首位不為零)從左向右讀與從右向左讀都是一樣,我們就將其稱之為回文數(shù)。例如:給定一個 10進制數(shù) 56,將 56加 65(即把56從右向左讀),得到 121是一個回文數(shù)。又如,對于10進制數(shù)87:
STEP1: 87+78= 165?
STEP2: 165+561= 726
STEP3: 726+627=1353
STEP4:1353+3531=4884
在這里的一步是指進行了一次N進制的加法,上例最少用了4步得到回文數(shù)4884。
寫一個程序,給定一個N(2<N<=10或N=16)進制數(shù) M.求最少經(jīng)過幾步可以得到回文數(shù)。如果在30步以內(nèi)(包含30步)不可能得到回文數(shù),則輸出“Impossible” 。
【輸入】
給定一個N(2<N<=10或N=16)進制數(shù)M。
【輸出】
最少幾步。如果在30步以內(nèi)(包含30步)不可能得到回文數(shù),則輸出“Impossible”。
【輸入樣例】
9 87
【輸出樣例】
6
【源程序】
#include<iostream> #include<cstring> using namespace std; int n; int a[500],b[500],step=0; char str[500]; void add(int a[],int b[])//高精加 {int i;for(i=1;i<=a[0];i++){a[i]+=b[i];a[i+1]+=a[i]/n;a[i]%=n;}if(a[a[0]+1]>0)a[0]+=1; } bool judge(int a[])//判斷回文數(shù) {int i;for(i=1;i<=a[0]/2;i++)if(a[i]!=a[a[0]-i+1])return false;return true; } void overturn(int a[])//倒序存儲 {int i,j;b[0]=a[0];j=1;for(i=a[0];i>=1;i--){b[j]=a[i];j++;} } void print(int a[])//數(shù)據(jù)輸出 {int i;for(i=a[0];i>=1;i--)cout<<a[i];cout<<endl; } int main() {int len;int i;cin>>n>>str;len=strlen(str);int k=1;for(i=len-1;i>=0;i--)//數(shù)據(jù)處理{if('0'<=str[i]&&str[i]<='9'){a[k]=str[i]-'0';k++;}if('a'<=str[i]&&str[i]<='z'){a[k]=str[i]-'a'+10;k++;}if('A'<=str[i]&&str[i]<='Z'){a[k]=str[i]-'A'+10;k++;}}a[0]=len;while(judge(a)==0){overturn(a);add(a,b);step++;if(step>30)break;}if(step>30)cout<<"Impossible"<<endl;elsecout<<step<<endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的回文数(信息学奥赛一本通-T1309)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 训练日志 2018.12.16
- 下一篇: 暑期训练日志----2018.8.23