回文数111111111
題目描述
若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。
例如:給定一個10進制數56,將56加65(即把56從右向左讀),得到121是一個回文數。
又如:對于10進制數87:
STEP1:87+78? =? 165? STEP2:165+561? =? 726
STEP3:726+627? =? 1353? STEP4:1353+3531? =? 4884
在這里的一步是指進行了一次N進制的加法,上例最少用了4步得到回文數4884。
寫一個程序,給定一個N(2< =N< =10或N=16)進制數M(其中16進制數字為0-9與A-F),求最少經過幾步可以得到回文數。
如果在30步以內(包含30步)不可能得到回文數,則輸出“Impossible!”
輸入格式
兩行,N與M?
N(2< =N< =10或N=16)
M最多不超過100位
?
輸出格式
如果能在30步以內得到回文數,輸出“STEP=xx”(不含引號),其中xx是步數;否則輸出一行”Impossible!”(不含引號)?
輸入樣例 復制
9 87輸出樣例 復制
STEP=6分類標簽
高精度計算?
#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
int main()
{?
??int N,step=1;
??char M[100000];
??cin>>N>>M;
??loop:int a[100000],b[100000],result[100000],c=0;
????int carry=0,len=strlen(M);
????for(int i=0;i<len;i++){
??????if(N==16){
????????if(M[i]>='A' && M[i]<='F'){
??????????a[i]=M[i]-'7';
????????}
????????else{
??????????a[i]=M[i]-'0';
????????}
??????}
??????else{
????????a[i]=M[i]-'0';
??????}
????}
????for(int i=0;i<len;i++){
??????b[i]=a[len-1-i];/*求倒過來的數*/
????}
????for(int i=0;i<len;i++){/*所有位數通過for循環得到*/
??????int temp=a[i]+b[i]+carry;/*正數+倒數*/
??????result[c++]=temp%N;/*余數*//*加而不加*/
??????carry=temp/N;/*carry=進位*/
??????result[c]+=carry;/*result【c】單個數位*//*進位*/
????}
????int flag=1;/*判斷對錯*/
????if(carry!=0)result[c++]=carry;/*頭部位置多了一位數*/
????for(int i=0;i<c/2;i++){
??????if(step>=30){
????????flag=0;/*判斷是否超過30*/
????????cout<<"Impossible!";
????????break;
??????}
??????if(result[i]!=result[c-1-i])/*判斷是否回文*/{
????????step++;
????????for(int i=0;i<c;i++){
??????????if(N==16){
????????????if(result[c-1-i]>=10){
????????????????M[i]=result[c-1-i]+'7';/*假如是16進制,則最終結果可以是字母*/
????????????}
????????????else{
??????????????M[i]=result[c-1-i]+'0';
????????????}
??????????}
??????????else{
????????????M[i]=result[c-1-i]+'0';
??????????}
????????}
????????goto loop;
??????}
????}
????if(flag==1)cout<<"STEP="<<step;
???return 0;
}?
總結
以上是生活随笔為你收集整理的回文数111111111的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python论文排版格式_论文排版(一)
- 下一篇: Java生成csv文件设置文本格式