1、方法一:
class Solution1 {
public:
int NumberOf1OfN(int n)
{
int cnt=0;
while(n!=0){
if(n%10==1){
cnt++;
}
n=n/10;
}
return cnt;
}
int NumberOf1Between1AndN_Solution(int n)
{
int cnt=0;
for(int i=1;i<=n;i++){
cnt+=NumberOf1OfN(i);
}
return cnt;
}
};
2、方法二
使用递归的思路
class Solution2 {
public:
int numberof1(char* strN)
{
int first_digit=*strN-'0';
int len=strlen(strN);
if(len==1 && 0==first_digit){
return 0;
}else if(1==len && first_digit>0){
return 1;
}
int num_recursive=numberof1(strN+1);
int num_other=first_digit*(len-1)*pow(10,len-2);
//乘以first_digit是因为,以2为例,可以取值0和2,是两个;以3为例,可以取值0,2,3,是三个;
//1出现在第一位之外的其他位,其余的位数字在0到9这10个数字任意选择,由排列组合可以得出总次数
int num_first_digit=0;
if(first_digit>1){
num_first_digit=pow(10,len-1);
}else if(first_digit==1){
num_first_digit=atoi(strN+1)+1;
}
return num_first_digit+num_other+num_recursive;
}
int NumberOf1Between1AndN_Solution(int n)
{
if(n<=0){
return 0;
}
char strN[32];
sprintf_s(strN,"%d",n);
return numberof1(strN);
}
};