1 2 47 1024 2 47
1.000 0.100 0.261
题目找规律,思路:
一个数假如为2567,求0--2567满足抽奖条件的个数。
首先0--10有9个
10--100 9个
100--1000 90个
1000--10000 900个
一次类推则:
0---10 9个
0---100 18个
0---1000 108个
0---10000 1008个
可先求出0--1000的为108个。
然后1000--2000共9*10个
2000--2567 为56+1个
共108+90+57=155个
详细看代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
long double a[100],b[105];
void read()
{
a[1]=9,a[2]=18,a[0]=0;
for(int i=3;i<22;i++)
a[i]=pow(10,i-1)+8;
}
string to_string(long long x)
{
string ans;
while(x)
{
ans+=(x%10+‘0‘);
x/=10;
}
reverse(ans.begin(),ans.end());
return ans;
}
long double solve(string x,long long y)
{
if(x.size()<=2)
return b[y];
long double ans=0;
ans+=a[x.size()-1];
ans+=(x[0]-‘0‘-1)*pow(10,(x.size()-2));
long long cmp=0;
for(int i=1;i<x.size()-1;i++)
cmp=cmp*10+(x[i]-‘0‘);
ans+=cmp;
if(x[x.size()-1]>=x[0])
ans++;
return ans;
}
void isit() //0--100暴力
{
b[0]=0;
memset(b,0,sizeof(b));
for(int i=1;i<=100;i++)
{
int en=i%10,k=i/10,wei=1;
while(k)
{
k/=10;
wei*=10;
}
if(i/wei==en)
b[i]=b[i-1]+1;
else
b[i]=b[i-1];
}
//printf("%lld %lld\n",b[0],b[1]);
}
int main()
{
//freopen("rad.txt","r",stdin);
//freopen("O.txt","w",stdout);
long long x,y;
isit();
read();
while(~scanf("%lld%lld",&x,&y))
{
string st,se;
st=to_string(x-1),se=to_string(y);
long double ans_x=solve(st,x-1),ans_y=solve(se,y);
//printf("%lf %lf\n",ans_x,ans_y);
double sum=(double)(ans_y-ans_x)/(double)(y-x+1);
printf("%.3lf\n",sum);
}
return 0;
}
//999999999999999999 1000000000000000000
nyoj 897 数学题目 (找规律),布布扣,bubuko.com
原文:http://blog.csdn.net/y990041769/article/details/20065643