1. 程式人生 > 遊戲攻略 >《真女神轉生5》戰鬥系統簡析

《真女神轉生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;
}