1. 程式人生 > 其它 >P1015 [NOIP1999 普及組] 迴文數

P1015 [NOIP1999 普及組] 迴文數

轉自洛谷
  • 寫在前面

    1. 由於某些原因導致了這道題四個測試點居然WA了兩次太羞恥了:(

    2. 記得考慮輸入格式:十六進位制的輸入得用char讀

  • 分析

    1. 先看輸入輸出格式:輸入兩行,輸出一行
    2. 再看輸入意義:N為進位制數,M為輸入資料
    3. 再看輸出意義:
      1. 能得到:printf("STEP=%d",ans);
      2. 得不到:printf("Impossible!");(有個歎號!!!)
    4. 再看題面:
      1. 迴文數:長度為\(l\)時,第\(i\)個數等於第(\(l-i-1\))個數
      2. 數M的長度在100位之內:高精度
      3. 30步以內能否得到迴文數:不斷計算直至第30次,如果出現迴文數就跳出迴圈,否則繼續
      4. 我也不知道寫點啥好了但是不寫這行好像太少了
    5. 由題面可知,這道題至少需要高精度、一個用於檢查迴文數的函式
  • 開碼

    1. 讀入(注意十六進位制)

      int h2i(char s){
      	if(s>='0'&&s<='9') return s-'0';
      	if(s>='A'&&s<='F') return s-'A'+10;
      }
      void input(){
      	char M[105];
      	scanf("%d%s",&N,&M);
      	l = strlen(M);
      	for(int i = l-1;i>=0;i--){
      		A[i] = h2i(M[l-i-1]);
      	}
      }
      

      注意:讀入的16進位制數不能直接用int陣列存;讀入時倒序比後期倒序會好寫些(就是懶罷了)

    2. 檢查是否為迴文數

      bool check(){
      	for(int i = 0;i<l;i++){
      		if(A[i]!=A[l-i-1]) return false;
      	}
      	return true;
      }
      

      注意其實沒啥好主意的我只是想保持格式整齊

    3. 迴文數高精度加法

      void p(){
      	for(int i = 0;i<l;i++){
      		res[i] = A[i] + A[l-i-1];
      	}//直接進行一個迴文數的加而不用另開陣列儲存其迴文數
      	for(int i = 0;i<l;i++){
              
      		int nex = i+1;//下一個下標號,用於進位以及判斷是否超出原來位數
              
      		if(res[i] >= N){
      			if(nex >= l) l++;//若超出原來位數則位數+1
                  
      			res[nex] += (res[i]/N);
      			res[i] %= N;
                  //進行一個位的進(bushi
      		}
      	}
      	for(int i = 0;i<l;i++){
      		A[i] = res[i];
      	}//將結果陣列中的值賦值回A(由於是正數加法所以沒必要將A陣列清空,直接覆蓋就行)
      }
      

      注意:註釋

    4. 主函式

      int main() {
          //因為是全域性陣列所以就不用初始化了,初始全部為0
      	input();
      	for(int i = 0; i<30; i++) {
      		if(check()) {
      			printf("STEP=%d",i);
      			return 0;
      		}
      		p();
      	}
      	printf("Impossible!");//歎號!!!!!!啊啊啊啊啊啊啊啊
      	return 0;
      }
      

      注意:注意審題,實在不行復制也可以