日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法训练_ALGO14_回文数

發(fā)布時(shí)間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法训练_ALGO14_回文数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問題描述
  若一個(gè)數(shù)(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數(shù)。
  例如:給定一個(gè)10進(jìn)制數(shù)56,將56加65(即把56從右向左讀),得到121是一個(gè)回文數(shù)。

  又如:對(duì)于10進(jìn)制數(shù)87:
  STEP1:87+78 = 165 STEP2:165+561 = 726
  STEP3:726+627 = 1353 STEP4:1353+3531 = 4884

  在這里的一步是指進(jìn)行了一次N進(jìn)制的加法,上例最少用了4步得到回文數(shù)4884。

  寫一個(gè)程序,給定一個(gè)N(2<=N<=10或N=16)進(jìn)制數(shù)M(其中16進(jìn)制數(shù)字為0-9與A-F),求最少經(jīng)過幾步可以得到回文數(shù)。
  如果在30步以內(nèi)(包含30步)不可能得到回文數(shù),則輸出“Impossible!”
輸入格式
  兩行,N與M
輸出格式
  如果能在30步以內(nèi)得到回文數(shù),輸出“STEP=xx”(不含引號(hào)),其中xx是步數(shù);否則輸出一行”Impossible!”(不含引號(hào))
樣例輸入
9
87
樣例輸出

STEP=6


解析:回文數(shù)我們應(yīng)該都可以懂是什么意思。理一下解題思路:判斷是不是回文數(shù)->如果是,輸出第一步;如果不是,按照題目要求進(jìn)行加法,同時(shí)記錄步數(shù)->每做一步,進(jìn)行一次判斷看是不是回文數(shù),直到找到或者不可能為止。

理清了思路之后,我們就比較好寫代碼了:

#include<iostream> #include<string.h> using namespace std; char a[100]; int b[100]={0}; int result[102]={0}; int sum = 0; void trans_num(char judge[])//將字符型轉(zhuǎn)化成數(shù)字型 {for(int i = 0; i < sum; i++){if(judge[i]>='a'&&judge[i]<='z') b[i] = judge[i]-'a'+10;else if(judge[i]>='A'&&judge[i]<='Z')b[i] = judge[i]-'A'+10;elseb[i] = judge[i]-'0';} } void add(int judge[],int n)//實(shí)行加法運(yùn)算 ,n表示n進(jìn)制 {result[0] = 0;//手動(dòng)初始化 for(int i = 0; i < sum; i++){result[i] += judge[i] + judge[sum-1-i];result[i+1] = result[i]/n;//進(jìn)位 result[i] = result[i]%n;//本位 } if(result[sum]!=0)//產(chǎn)生進(jìn)位 {sum = sum + 1;} } void trans_result_to_b(int judge[])//將add結(jié)果放入到b數(shù)組中 {int j = 0;for(int i = sum-1; i >= 0; i--){b[j] = judge[i];j++;} } bool isPalindrome(int judge[]) {int flag = 1;int i = 0; int j = sum-1;while(1){if(judge[i]!=judge[j]){flag = 0;break;}else{if(i==j || i+1==j) break;i++;j--;}}if(flag==0) return false;else return true; } int main() {int N; //N進(jìn)制 int step = 1;//記錄步數(shù) int flag = 0;//記錄是否能找到回文數(shù) cin>>N;getchar();//吃回車 gets(a);//獲得數(shù)組 sum = strlen(a);//數(shù)組的長(zhǎng)度 trans_num(a);//將字符型數(shù)組轉(zhuǎn)化成數(shù)字型數(shù)組 add(b,N);//進(jìn)行加法運(yùn)算 trans_result_to_b(result);//將結(jié)果數(shù)組放到b數(shù)組中 if(isPalindrome(b)){cout<<"STEP=0"<<endl;}else{while(1){if(isPalindrome(b)){flag = 1;//找到回文數(shù) break;}else if(step>30){flag = 0;//沒有找到回文數(shù) break;} else{add(b,N);//進(jìn)行加法運(yùn)算 trans_result_to_b(result);//將結(jié)果數(shù)組放到b數(shù)組中 step++;} } if(flag==1)cout<<"STEP="<<step<<endl;elsecout<<"Impossible!"<<endl;} return 0; }
tips:在對(duì)數(shù)組進(jìn)行處理,尤其是進(jìn)行加法運(yùn)算的時(shí)候,注意一下這里數(shù)據(jù)的特殊性——回文數(shù),這就意味著數(shù)組從低位到高位元素分別為167或者761都是一樣的。意識(shí)到這一點(diǎn),就給我們計(jì)算帶來了很大方便,不需要去考慮什么低位的數(shù)字權(quán)重高什么的。。。


最初的時(shí)候,進(jìn)行進(jìn)制轉(zhuǎn)化時(shí),我沒有考慮到十六進(jìn)制字母的轉(zhuǎn)化,所以沒有一次過,看來思維嚴(yán)密性還是有待提高。加油!

總結(jié)

以上是生活随笔為你收集整理的算法训练_ALGO14_回文数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。