poj1019(線段樹)
http://user.qzone.qq.com/289065406/blog/1301527312
這個題解,挺詳細,不錯。
這個題解,挺詳細,不錯。
注意的就是log()和pow()函數的使用
兩個都是重載函數,函數原型分別為
double log(double)
float log(float)
double pow(double , double)
float pow(float ,float)
所以當傳參的類型不是double或float時,必須強制轉換為其中一種類型,否則編譯出錯。一般建議用double
#include<stdio.h>
#include<string.h>
#include<math.h>
unsigned a[31269],s[31269];
int init()
{
int i;
a[1]=s[1]=1;
for (i=2; i<31269 ; i++ )
{
a[i]=a[i-1]+(int)log10((double)i)+1;
s[i]=s[i-1]+a[i];
}
return 0;
}
int compute(int n)
{
int i=1,pos,len;
while (s[i]<n)
i++;
pos=n-s[i-1];
len=0;
for (i=1; len<pos ; i++ )
len+=(int)log10((double)i)+1;
return (i-1)/(int)pow((double)10,len-pos)%10;
}
int main()
{
int t,n,ans,i;
init();
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
ans=compute(n);
printf("%d\n",ans);
}
return 0;
}
#include<string.h>
#include<math.h>
unsigned a[31269],s[31269];
int init()
{
int i;
a[1]=s[1]=1;
for (i=2; i<31269 ; i++ )
{
a[i]=a[i-1]+(int)log10((double)i)+1;
s[i]=s[i-1]+a[i];
}
return 0;
}
int compute(int n)
{
int i=1,pos,len;
while (s[i]<n)
i++;
pos=n-s[i-1];
len=0;
for (i=1; len<pos ; i++ )
len+=(int)log10((double)i)+1;
return (i-1)/(int)pow((double)10,len-pos)%10;
}
int main()
{
int t,n,ans,i;
init();
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
ans=compute(n);
printf("%d\n",ans);
}
return 0;
}
posted on 2012-03-24 23:07 wangs 閱讀(258) 評論(0) 編輯 收藏 引用 所屬分類: ACM-201203