
正文
模板:统计1~n内x的个数
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
http://noi.openjudge.cn/ch0105/40/
40:数1的个数-拓展变形
- 查看
- 提交
- 统计
- 提问
- 1000ms
- 65536kB
给定一个十进制正整数n,写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。
例如当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5个“1”。
- 正整数n。1 <= n <= 10000。
- 一个正整数,即“1”的个数。
12
5
#include <iostream>
#include <cstdio>
#include <cstring> //for memset
#include <algorithm> //for max
using namespace std;int cntone(int n,int x)
{
int cnt=,i=,tmp;
for(i=;i<=n;i++)//1~n
{
tmp=i;
while(tmp)
{
if(tmp%==x)
cnt++;
tmp/=;
}
}
return cnt;
}
int main()
{
int n,x;
while(cin>>n>>x)
{
cout<<cntone(n,x)<<endl;
}
}
time:nlog(n) 计算数字 x 在 1-n 中出现的次数
找规律:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
/*只求1的个数*/
int cntone(int n)
{
int cnt=;
for(int i=;i<=n;i*=)//1~n
{
int a=n/i,b=n%i;
cnt+=(a+)/*i+((a%)==?b+:); //之所以补8,是因为当百位为0,则a/10==(a+8)/10,当百位>=2,补8会产生进位位,效果等同于(a/10+1)
}
return cnt;
}
int main()
{
int n;
while(cin>>n)
{
cout<<cntone(n)<<endl;
}
}
time:logn 计算数字 1 在 1-n 中出现的次数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
// 计算数字 X (不包括0)在 1-n 中出现的次数。
// X = 0 时,规律与上面给出的规律不同,需要另行考虑。
int cntone(int n,int x)
{
int cnt=,tmp;
for(int i=; tmp=n/i; i*=)//1~n
{
cnt += (tmp/)*i;
int cur = tmp%;
if(cur>x)
{
cnt+=i;
}
else if(cur == x)
{
cnt+=n-tmp*i+;
}
}
return cnt;
}
// X = 0 时
int cntzero(int n)
{
int cnt=,k;
for(int i=; (k=n/i)/; i*=)
{
cnt+= (k/)*i;
if(k%==)
{
cnt+=n-k*i+-i;
}
}
return cnt;
}
//合并:计算数字 X 在 1-n 中出现的次数,对 X 从 0 到 9 都有效:
int cnts(int n,int x)
{
int cnt=,k;
for(int i=; k=n/i; i*=)
{
int high=k/;
if(x==)
{
if(high) high--;
else break;
}
cnt+=high*i;
int cur=k%;
if(cur>x) cnt+=i;
else if(cur==x) cnt+=n-k*i+;
}
return cnt;
}
int main()
{
int n,x;
while(cin>>n>>x)
{
cout<<cntone(n,x)<<" "<<cntzero(n)<<" "<<cnts(n,x)<<endl;
}
}
计算数字 X 在 1-n 中出现的次数,对 X 从 0 到 9 都有效
2. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;int cnts(int x)
{
int cnt=;
while(x)
{
if(x%==) cnt++; //n&1
x/=; //n>>=1;
}
return cnt;
}int main()
{
int n;
while(~scanf("%d",&n),n)
{
int cnt=cnts(n);
while(n++)
{
if(cnt==cnts(n))
{
cout<<n<<endl;
break;
}
}
}
}
poj 2453
51nod 1042






