《信息学奥赛一本通》回文数(Noip 1999)
生活随笔
收集整理的這篇文章主要介紹了
《信息学奥赛一本通》回文数(Noip 1999)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
若一個數(首位不為零)從左往右讀與從右往左讀都是一樣,,我們就將其稱之為回文數。例如:給定一個10進制數56,將56加65(即把56從右往左讀),得到121是一個回文數。又如,對于十進制數87,step1:87+78=165step2:165+561=726step3:726+627=1353step4:1353+3531=4884在這里的一步是指進行了一次n進制的加法,上例最少用了4步得到回文數4884.寫一個程序,給定一個n(2<n<=10或n=16)進制數m。求最少經過幾步可以得到回文數。如果在30步以內(包含30步)不可能得到回文數,則輸出“impossible”。
【輸入樣例】
9 87
【輸出樣例】
6
【算法分析】
n進制運算
1.當前位規范有10%改為n%
2.進位處理由/10改為/n
3.其他運算規則不變
【參考代碼】
#include <iostream> #include <cstring> using namespace std; int n,a[101],b[101],ans,i; void init (int a[]) {//將數串s轉化為整數數組astring s;cin>>n>>s;//讀入字符串smemset(a,0,sizeof(a));//數組a清零a[0]=s.length();//用a[0]計算字符串s的位數for(i=1;i<=a[0];i++){if(s[a[0]-i]>='0'&&s[a[0]-i]<='9'){a[i]=s[a[0]-i]-'0';}else{a[i]=s[a[0]-i]-'A'+10;}} } bool check(int a[]) {//判別整數數組a是否為回文數for(i=1;i<=a[0];i++){if(a[i]!=a[a[0]-i+1])return false;}return true; } void jia(int a[]) {//整數數組a與其反序數b進行n進制加法運算int i,k;for(i=1;i<=a[0];i++){//反序數bb[i]=a[a[0]-i+1];}for(i=1;i<=a[0];i++){//逐位相加a[i]+=b[i];}for(i=1;i<=a[0];i++){//處理進位a[i+1]+=a[i]/n;a[i]%=n;}if(a[a[0]+1]>0){//修正新的a的位數(a+b最多只能進一位)a[0]++;} } int main () {init(a);if(check(a)){cout<<0<<endl;return 0;}ans=0;//步數初始化為0while(ans<=30){ans++;jia(a);if(check(a)){cout<<ans<<endl;return 0;}}cout<<"impossible";return 0; }總結
以上是生活随笔為你收集整理的《信息学奥赛一本通》回文数(Noip 1999)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《信息学奥赛一本通》 高精度加法。输入
- 下一篇: 《信息学奥赛一本通》 高精度减法。输入两