整数中1出现的次数(从1到n整数中1出现的次数)
求出1到13的整数中1出现的次数,并算出100到1300的整数中1出现的次数。为此他特地数了1到13之间包含1的数字有1,10,11,12,13,因此共出现6次但对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快求出任一非负整数区间中1出现的次数(从1到n整数中1出现的次数)。
题解:
对于1到n中出现的1的次数,需要判定的是,1到n中每个数中1出现的次数,对此有两种方法。
1)余数法:
对于1到n中的任意一个数,对其进行取余数法,观察每个个、十、百、千。。。。。。等等位上的是否是1。对数进行%10操作,观察每位上是否为1。
代码如下:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n){
int res;
if(n<1) return 0;
if(n<10) return 1;
res=0;
for(int i=1;i<=n;i++){
int k=i;
while(k>0){
int t=k%10;
if(t==1)
res++;
k=k/10;
}
}
return res;
}
};
2)字符串判定
将1到n间的每一个数转换为字符串类型,对每个string类型的数据进行每位判定,观察每位上是否是1。
代码如下:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n){
/*int res;
if(n<1) return 0;
if(n<10) return 1;
res=0;
for(int i=1;i<=n;i++){
int k=i;
while(k>0){
int t=k%10;
if(t==1)
res++;
k=k/10;
}
}
return res;*/
int res=0;
if(n<0) return 0;
for(int i=1;i<=n;i++){
string str=to_string(i);
for(int j=0;j<str.size();j++)
if(str[j]=='1')
res++;
}
return res++;
}
};