2017-08-31 68 views
2

我想將輸入到電子表格column_id中的整數(即 1)轉換爲A,2至B,26至Z,27到AA等等。 我的代碼對於除26的倍數之外的所有輸入都正確運行,並且我無法形成它的邏輯。可能的邏輯是什麼?將整數轉換爲電子表格column_id時出錯(1至'A',2至'B'...)

#include<iostream> 
#include<algorithm> 
using namespace std; 
int main(){ 
    int a,n; 
    string b; 
    cin>>a; 
    b=""; 
    while(a){ 
     b+=((a%26)+'A'-1); 
     a/=26; 
    } 
    reverse(b.begin(),b.end()); 
    cout<<b<<"\n"; 
return 0; 
} 

輸入 -

26 

輸出 -

[email protected] 

預期輸出 -

Z 
+2

這聽起來像你可能需要學習如何使用調試器來逐步通過你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:[如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。你會看到角色不會自動環繞,你必須自己做。 – NathanOliver

+0

問題:26%26的價值是多少? – Mat

+1

......並沿同一行「26/26」?提示:它不是'0'。 – WhozCraig

回答

4

所以首先:爲什麼發生這個錯誤?

如果您選擇進入26作爲價值a你計算值b如下:

b += ((26 % 26) + 'A' - 1); // or 

b += (0 + 'A' - 1); // or 

b += 'A' - 1; // which is equal to the '@' symbol 

所以,很顯然你做不想從自己的信中減去。但是如果在使用模運算符之前減少a會發生什麼?

a--; 
while (a) { 
    b+=static_cast<char>('A' + (a % 26)); 
    a/=26; 
} 

嗯,這現在將正確的值從1-26的工作,但對於值高於26的將無法正常工作的情況下,不會進入循環您a輸入1。切換到do-while循環將修復後者,但仍然會有問題。對於每個大於26的數字,您將得到一個字符串,這是前面27個單元格(因此BA而不是AA)。而是由移動a--進入循環,這將是固定的,以及:

do { 
    a--; 
    b+=static_cast<char>('A' + (a % 26)); // static_cast not needed just for clarity 
    a/=26; 
} while(a); 

Here是一個工作示例。

相關問題