《真女神轉生5》戰鬥系統簡析
今天學習內容是高精度計算。這裡記錄一下今天的作業題。
【問題描述】
若一個數(首位不為零)從左向右讀與從右向左讀都是一樣,我們就將其稱之為迴文數。例如:給定一個10進位制數56,將56加65(即把56從右向左讀),得到121是一個迴文數。又如,對於10進位制數87,
STEPl: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”
【輸入樣例】
987
【輸出樣例】
6
【思路】輸入->迴圈30次,每次判斷得到的數是否為迴文數?跳出:繼續->提前跳出?輸出次數:“Impossible”。判斷過程分為兩個函式:第一步高精度計算得出每次結果;第二步判斷結果是否為迴文數。
【程式碼】
#include<bits/stdc++.h>
using namespace std;
string add(int n,string a)
{
char a1[201]={0},b1[201]={0},s[201]={0};
int i,l;
l=a.size();
for(i=0;i<l;i++) a1[i]=a[l-i-1]-'0';
for(i=0;i<l;i++) b1[i]=a[i]-'0';
for(i=0;i<l;i++)
{
a1[i]+=b1[i];
if(a1[i]>=n)
{
a1[i+1]++;
a1[i]-=n;
}
for(i=l;!a1[i] && i;i--);
l=i;
for(i=0;i<=l;i++) s[i]=a1[l-i]+'0';
s[i]='\0';
return s;
}
bool check(int n,string a)
{
int i,l=a.size();
for(i=0;i<l;i++)
if(a[i]!=a[l-1-i])
return 0;
return 1;
}
int main()
{
int n,t;
string a,b;
scanf("%d%d",&n,&a);
for(t=1;t<=30;t++)
{
if(t==1) b=add(n,a);
else b=add(n,b);
if(check(n,b))
break;
}
if(t<=30)
printf("%d",t);
else
printf("Impossible");
return 0;
}