題目描述:
輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。
完整代碼:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
//檢查輸入的合法性
if(n <= 0)
return 0;
//聲明一個變量,用來存放數字
char array[50];
//將整數轉換成字符串
sprintf(array,"%d",n);
//返回 1 的出現正數
return Numbersof1(array);
}
private:
//統計 1 出現的次數
int Numbersof1(const char* array)
{
//檢查輸入的合法性
if(!array || *array < '0'|| *array > '9'|| *array == '\0' )
return 0;
//計算開頭的第一個數字
int first = *array - '0';
//計算 array 的長度
unsigned int length = static_cast<unsigned int> (strlen(array));
//計算單個數字0的情況
if(length == 1 && first == 0)
return 0;
//計算單個數字非 0 的情況
if(length == 1 && first > 0)
return 1;
//假設數字爲21345,將數字分成 1~1345 和 1346~21345
/******計算1346~ 21345中,最高位 1 出現的次數********/
//統計 1 出現的次數
int NumFirstDigits = 0;
//如果最高位大於 1
if(first > 1)
//則 1 出現的次數爲 10的(lenght - 1)次方
NumFirstDigits = Numbersof10(length - 1);
//如果最高爲等於 1
else if(first == 1)
//則 1 的出現次數爲 除 1 以外的後面數字 + 1
NumFirstDigits = atoi(array + 1) + 1;
/*******計算出最高位之外 1 出現的次數********/
//聲明一個變量,統計此種情況下 1 出現的次數
int NumOtherDigits = first * (length - 1) * Numbersof10(length - 2);
//遞歸計算 1~1345 中 1 出現的次數
//聲明一個變量,計算此種情況下的 1 的個數
int NumRecursive = Numbersof1(array + 1);
//返回最終 1 出現的次數
return NumFirstDigits + NumOtherDigits + NumRecursive;
}
//計算 10 的 n 次方
int Numbersof10(unsigned int n)
{
int result = 1;
for(unsigned int i = 0; i < n; ++i)
result *= 10;
//返回結果
return result;
}
};