题目:输入一个整数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;
}