题目描述
一天,小R准备找小h去游泳,当他找到小h时,发现小h正在痛苦地写着一列数,1,2,3,…n,于是就问小h痛苦的原因,小h告诉他,现在他要算1…n这些数里面,1出现的次数是多少,如n=11的时候,有1,10,11共出现4次1,现在给出n,你能快速给出答案么?
输入
一行,一个整数n
输出
一个整数,表示1…n中1出现的次数。
输入样例
11
输出样例
4
说明
对于30%的数据:n<=1000;
对于100%的数据:n<=maxlongint;
.
.
.
.
.
.
分析
.
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,l=0;
long long s=0;
int main()
{
scanf("%d",&n);
int x=n,y,w=1;
while (x!=0)
{
y=x%10;
if (y==0) s+=(x/10)*w;
if (y==1) s+=(x/10)*w+l+1;
if (y>1) s+=(x/10+1)*w;
x/=10;
l=l+y*w;
w*=10;
}
printf("%lld",s);
return 0;
}

本文介绍了一个算法,用于快速计算从1到任意正整数n中数字1出现的总次数。通过分析数字构成,算法巧妙地将问题转化为数学计算,避免了遍历所有数字的传统方法,大大提高了效率。
549

被折叠的 条评论
为什么被折叠?



