Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:BlessAladdin,实在不好意思,我有点问题想请教一下的。又引起我的怀疑的。。。。。In Reply To:BlessAladdin,实在不好意思,我有点问题想请教一下的。又引起我的怀疑的。。。。。 Posted by:HW at 2005-08-01 03:15:42 > 我的程序已经AC了,不过是把精度放低了,放到double才过了,用long long是过不了的 > > 问题还是我之前说的那个,精度不够高 > 我用了 > time ./a3 > > real 433m0.787s > user 430m48.242s > sys 0m21.187s > > 433分钟把我同学的那个AC的程序(把精度改成long long之后的),从1到2^31-1的所有数据都跑了一次,全部和我的程序都一样的 > 我把那个程序的精度改成long long后再提交也过不了了,改成double就过了。 > > 我自己的程序也是一样的。 > > 我现在又再一次,怀疑测试用的数据有不对的地方了,不是指你的程序有问题。 > 你能帮忙看看是什么问题吗?有可能是数据的问题吗? AC: ---------------------------------------- #include <stdio.h> #include <string.h> #include <math.h> #define maxn 100 #define maxSave 20 #define maxSave1 11 unsigned long long save[maxn][2]; unsigned long long save1[maxn][2]; int check(double t,int k){ char ch[200]; sprintf(ch,"%.0lf",t); return ch[k]-'0'; } void buildSave(){ unsigned long long k=1; unsigned long long i; for (i=10;k<maxSave;i*=10){ save[k][0]=(unsigned long long)sqrtl((long double)(i-1)); save[k][1]=(save[k][0]-save[k-1][0])*k+save[k-1][1]; k++; } k=1; save1[0][0]=save1[0][1]=0; for (i=10;k<maxSave1;i*=10){ save1[k][1]=save1[k-1][1]+(i-(i/10))*k; save1[k][0]=i-1; k++; } } int findSave(unsigned long long k){ unsigned long long i,t,u; double tem; for (i=0;;i++) if (k<=save[i+1][1]){t=i+1; break;} u=(k-save[t-1][1]+(t-1))%t; k=(k-save[t-1][1]+(t-1))/t; k=k+save[t-1][0]; tem=(double)k; tem*=tem; return check(tem,u); } int findSave1(unsigned long long k){ unsigned long long i,t,u; for (i=0;;i++) if (k<=save1[i+1][1]){t=i+1; break;} u=(k-save1[t-1][1]+(t-1))%t; k=(k-save1[t-1][1]+(t-1))/t+save1[t-1][0]; return check(k,u); } int main(){ unsigned long long t,i; int s[1000],s1[1000],k; buildSave(); while (scanf("%lld",&t) && t>0){ k=0; s[k]=findSave(t); s1[k]=findSave1(t); k++; for (i=t+1;;i++){ s[k]=findSave(i); s1[k]=findSave1(i); if (s[k]+s1[k]<9 || s[k]+s1[k++]>=10) break; } for (i=k-1;i>=1;i--) s[i-1]=(s[i]+s1[i])/10+s[i-1]; printf("%d\n",(s[0]+s1[0])%10); } return 0; } -------------------------------------------------------- WA: -------------------------------------------------------- #include <stdio.h> #include <string.h> #include <math.h> #define maxn 100 #define maxSave 20 #define maxSave1 11 unsigned long long save[maxn][2]; unsigned long long save1[maxn][2]; int check(unsigned long long t,int k){ char ch[200]; sprintf(ch,"%lld",t); return ch[k]-'0'; } void buildSave(){ unsigned long long k=1; unsigned long long i; for (i=10;k<maxSave;i*=10){ save[k][0]=(unsigned long long)sqrtl((long double)(i-1)); save[k][1]=(save[k][0]-save[k-1][0])*k+save[k-1][1]; k++; } k=1; save1[0][0]=save1[0][1]=0; for (i=10;k<maxSave1;i*=10){ save1[k][1]=save1[k-1][1]+(i-(i/10))*k; save1[k][0]=i-1; k++; } } int findSave(unsigned long long k){ unsigned long long i,t,u; for (i=0;;i++) if (k<=save[i+1][1]){t=i+1; break;} u=(k-save[t-1][1]+(t-1))%t; k=(k-save[t-1][1]+(t-1))/t; k=k+save[t-1][0]; return check(k*k,u); } int findSave1(unsigned long long k){ unsigned long long i,t,u; for (i=0;;i++) if (k<=save1[i+1][1]){t=i+1; break;} u=(k-save1[t-1][1]+(t-1))%t; k=(k-save1[t-1][1]+(t-1))/t+save1[t-1][0]; return check(k,u); } int main(){ unsigned long long t,i; int s[1000],s1[1000],k; buildSave(); while (scanf("%lld",&t) && t>0){ k=0; s[k]=findSave(t); s1[k]=findSave1(t); k++; for (i=t+1;;i++){ s[k]=findSave(i); s1[k]=findSave1(i); if (s[k]+s1[k]<9 || s[k]+s1[k++]>=10) break; } for (i=k-1;i>=1;i--) s[i-1]=(s[i]+s1[i])/10+s[i-1]; printf("%d\n",(s[0]+s1[0])%10); } return 0; } -------------------------------------------------------- Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator