30.在从1到n的正数中1出现的次数(数组)

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。

例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:这是一道广为流传的google面试题。

 

这里可以看成是排列组合的问题,某一位上为1,然后看其他位置上值不同的次数。

输入45678,

现在百位为6,假设百位为1,那么百位前面的千位和万位的不同次序有 45+1 种。百位后面的十位和各位的次序有 10*10 种。

 

#include <iostream>

int sum(int n);
int mypow(int i);

int main()
{
	int n = 100 ;
	int s = sum(10);

	return 0;
}

int sum(int n)
{
	int s = 0 ;
	for (int i=0;n/(mypow(i))>=1;i++)
	{
		if ((n/(mypow(i+1)) < 1))
			return s + n%(mypow(i)) +1 ;
		else if ((n/(mypow(i)))%10 == 0)
			s = s + (n/(mypow(i+1)))*(mypow(i)) ;
		else
			s = s + (n/(mypow(i+1)) + 1)*(mypow(i)) ;
	}
	return 0;
}

int mypow(int i)
{
	if (i==0)
		return 1;
	int s = 1 ;
	for (int j=0;j<i;j++)
		s = s * 10 ;
	return s;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值