題目:輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字有1,10,11和12, 1一共出現了5次。
方法1:累加1到n中每個整數1出現的次數。每次通過對10求餘數判斷整數的個位數字是不是1。如果這個數字大於10,除以10之後再判斷個位數字是不是1。
int numberof1between1andn(unsigned
int n)
return number;
}int numberof1(unsigned
int n)
n = n / 10;
}return number;
}
方法2:以21345為例。
從1~1345可以遞迴求得。
int numberof1between1andn(int n)
char strn[50];
sprintf(strn, "%d", n);
return numberof1(strn);
}int numberof1(const
char* strn)
int first = *strn - '0';
unsigned
int length = static_cast
int>(strlen(strn));
if (length == 1 && first == 0)
if (length == 1 && first > 0)
//假設strn是「21345」
//numfirstdigit是數字10000~19999的第一位中的數目
int numfirstdigit = 0;
if (first > 1)
else
if (first == 1)
//numotherdigits是1346~21345除了第一位之外的數字中的數目
int numotherdigits = first * (length - 1) * powerbase10(length - 2);
//numrecursive是1~1345中的數目
int numrecursive = numberof1(strn + 1);
return numfirstdigit + numotherdigits + numrecursive;
}int powerbase10(unsigned
int n)
return result;
}
測試用例: 整數中1出現的次數(從1到n整數中1出現的次數)
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。include u...
整數中1出現的次數(從1到n整數中1出現的次數)
時間限制 1秒 空間限制 32768k 題目描述 include using namespace std class solution 求之前的length 1位中含乙個數 int base1 0 int base2 1 for int i 0 i1 i cout cout cout 求從base2...
整數中1出現的次數(從1到n整數中1出現的次數)
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。演算法一 暴力累加...