從1到n整數(shù)中1出現(xiàn)的次數(shù)-創(chuàng)新互聯(lián)

從1到n整數(shù)中1出現(xiàn)的次數(shù)

成都創(chuàng)新互聯(lián)公司主營紅河哈尼網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,紅河哈尼h5微信小程序搭建,紅河哈尼網(wǎng)站營銷推廣歡迎紅河哈尼等地區(qū)企業(yè)咨詢

要計(jì)算X出現(xiàn)的次數(shù)(從1到n整數(shù)中1出現(xiàn)的次數(shù)),需統(tǒng)計(jì)X在每一位出現(xiàn)的次數(shù)。

1到10出現(xiàn)1次X;1到100出現(xiàn)10次X;1到1000出現(xiàn)100次X。

綜上可以得出:從 1 至 10i,在它們的左數(shù)第二位(右數(shù)第 i 位)中,任意的 X 都出現(xiàn)了 10i1 次。

Eg:以n=21345,X=1

依次分析X在各位中出現(xiàn)的次數(shù):

個位:因?yàn)?1340中有2134個10,所以從1到21340,1出現(xiàn)了2134次;再看從21341到21345,因?yàn)?<5(這里X為1,肯定滿足,當(dāng)X為任意數(shù)時(shí),應(yīng)判斷X<5是否成立),所以1在個位中出現(xiàn)的次數(shù)為2135次。

十位:因?yàn)?1300中有213個100,所以從1到21300,1出現(xiàn)在十位的次數(shù)為213*10次,再看從21301到21345,因?yàn)?>1,所以十位出現(xiàn)的次數(shù)為(213+1)*10^(2-1)=2140.

同理,百位出現(xiàn)的次數(shù)為(21+1)*10^(3-1)=2200.

千位:因?yàn)?0000中共有2個10000,所以從1到20000,1出現(xiàn)在千位的次數(shù)為2*1000次,再看從20001到21345,因?yàn)?==1,所以千位中肯定含有1,但不會是1000次,而是345+1=346次(因?yàn)橛?1000,所以要加1),所以1出現(xiàn)在千位的總次數(shù)為2*10^(4-1)+(345+1)=2346次。

萬位:方法同上,出現(xiàn)的次數(shù)為(0+1)*10^(5-1)=10000.

所以:21345中1出現(xiàn)的次數(shù)為2135+2140+2200+2346+10000=18821次

X在第i位出現(xiàn)的次數(shù)的計(jì)算方法:

1、取第i位左邊(高位)的數(shù)字,乘以10^(i-1),得到基本的sum

2、取第i位數(shù)字:

1)如果大于X,則結(jié)果sum+=10^(i-1).

2)如果等于X,則結(jié)果為

sum+=(第i位右邊的(低位)的數(shù)字)+1

3)如果小于X,則結(jié)果就為sum

代碼如下:

size_t NumberOf1Between1AndN_Solution(size_t n)
{
	char str[12] = { 0 };
	int length = strlen(_itoa(n, str, 10));//計(jì)算n的位數(shù)
	size_t countSum = 0;
	//為取第i位數(shù)字簡便,所以以下采取str運(yùn)算
	for (int i = length - 1; i >= 0; --i)
	{
		//取第i位左面的數(shù)字
		int tmpLeft = 0;
		for (int j = 0; j < i; ++j)
		{
			tmpLeft = tmpLeft * 10 + str[j] - '0';
		}

		countSum += tmpLeft * pow(10, length - i - 1);
		int iVal = str[i] - '0'; //第i位的數(shù)字
		//如果大于X,則結(jié)果countSum+=pow(10, i).
		if (iVal > 1)
		{
			countSum += pow(10, length - i - 1);
		}
		//如果等于X,則結(jié)果為countSum+=(第i位右邊的(低位)的數(shù)字)+1
		else if (iVal == 1)
		{
			int tmpRight = 0;//計(jì)算低位數(shù)字
			for (int j = i + 1; j < length; j++)
			{
				tmpRight = tmpRight * 10 + str[j] - '0';
			}
			countSum += tmpRight + 1;
		}
		//如果小于X,則結(jié)果就為countSum
	}
	return countSum;
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前名稱:從1到n整數(shù)中1出現(xiàn)的次數(shù)-創(chuàng)新互聯(lián)
本文URL:http://muchs.cn/article40/cddcho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、小程序開發(fā)外貿(mào)建站、建站公司定制開發(fā)、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營