日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算1到N的十进制数中1的出现次数

發(fā)布時間:2024/9/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算1到N的十进制数中1的出现次数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:http://hi.baidu.com/zhaoshengjin/blog/item/f1df6618cb1debbe4bedbc5d.html

問題描述:給定一個十進(jìn)制正整數(shù)N,寫下從1開始,到N的所有整數(shù),然后數(shù)一下其中出現(xiàn)的所有"1"的個數(shù)。例如:
N = 2,寫下1,2。這樣只出現(xiàn)了1個"1"。
N = 12,寫下1,2,……,12,這樣有5個"1"。
寫一個函數(shù)f(N),返回1到N之間出現(xiàn)的"1"的個數(shù),比如f(12) = 5。

??? 假設(shè)N = abcde,這里a,b,c,d,e分別是十進(jìn)制數(shù)N的各個數(shù)位上的數(shù)字。如果要計算百位上出現(xiàn)1

的次數(shù),將受3方面因素影響:百位上的數(shù)字,百位以下(低位)的數(shù)字,百位(更高位)以上的數(shù)字。

??? 如果百位上的數(shù)字為0,則可以知道百位上可能出現(xiàn)1的次數(shù)由更高位決定,比如12 013,則可以知

道百位出現(xiàn)1的情況可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200個。也就是

由更高位數(shù)字(12) 決定,并且等于更高位數(shù)字(12)×當(dāng)前位數(shù)(100)。

??? 如果百位上的數(shù)字為1,則可以知道,百位上可能出現(xiàn)1的次數(shù)不僅受更高位影響,還受低位影響,

也就是由更高位和低位共同決定。例如12 113, 受更高位影響,百位出現(xiàn)1的情況是100-199,1 100

-1 199,……,11 100-11 199,一共有1 200個,和上面第一種情況一樣,等于更高位數(shù)字(12)×當(dāng)

前位數(shù)(100)。但它還受低位影響,百位出現(xiàn)1的情況是12 100-12 113,一共14個,等于低位數(shù)字

(13)+1。一共為1200+14 = 1214.

???如果百位上數(shù)字大于1(即為2-9),則百位上可能出現(xiàn)1的次數(shù)也僅由更高位決定,比如12 213,則

百位出現(xiàn)1的情況是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300個

,并且等于更高位數(shù)字+1(12+1)×當(dāng)前位數(shù)(100)。

今天百度之星的第二題就是求幾個數(shù)出現(xiàn)的次數(shù),比如求12388以內(nèi)以88結(jié)尾的所有數(shù)的數(shù)量,如果最后兩位>=88則數(shù)量為123+1,但是如果最后兩位<88,數(shù)量為123。一定要謹(jǐn)慎,多少次教訓(xùn)了!


按照位來統(tǒng)計在這個位上所有的1的個數(shù)

#include <iostream>
#include <windows.h>
using namespace std;

LONGLONG Sum1s( ULONGLONG n )
{
??? ULONGLONG iCount = 0;
??? ULONGLONG iFactor = 1;

??? ULONGLONG iLowerNum = 0;
??? ULONGLONG iCurrNum = 0;
??? ULONGLONG iHigherNum = 0;

? //從數(shù)n的最低位開始,n/iFactor表示的是當(dāng)前處理的數(shù)的數(shù)值

//譬如數(shù)1234,則n/iFactor依次表示 1234,123,12,1

??? while( n / iFactor != 0 )
??? {
??????? iLowerNum = n - ( n / iFactor ) * iFactor;
??????? iCurrNum = (n / iFactor ) % 10;
??????? iHigherNum = n / ( iFactor *10 );

??????? switch( iCurrNum )
??????? {
??????? case 0:
??????????? iCount += iHigherNum * iFactor;
??????????? break;
??????? case 1:
??????????? iCount += iHigherNum * iFactor + iLowerNum + 1;
??????????? break;
??????? default:
??????????? iCount += ( iHigherNum + 1 ) * iFactor;
??????????? break;
??????? }

??????? iFactor *= 10;
??? }
??? return iCount;
}

int main()
{
??? cout << Sum1s(100000000);

??? cin.get();????
??? return 0;
}


總結(jié)

以上是生活随笔為你收集整理的计算1到N的十进制数中1的出现次数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。