codeforce_219B Special Offer! Super Price 999 Bourles!

左手的ㄟ右手 2022-08-11 17:28 197阅读 0赞

一道考虑细节多一点的题目,WA了好多次。没什么算法,就是做完这道题人都不好了,才有了 关于数据测试 这点感想,不过还好有了教训就要长记性,我相信我会进步的。毕竟努力是有收获的。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. typedef __int64 LL;
  6. using namespace std;
  7. int getdig(LL n){
  8. if(n==0)return 1;
  9. n=n>0?n:-n;
  10. int digit=1;
  11. while(n>=10){
  12. n/=10;
  13. ++digit;
  14. }
  15. return digit;
  16. }
  17. LL mpow10(int x){
  18. if(x<0)return 1;
  19. LL base=10,ans=1;
  20. while(x!=0){
  21. if(x%2)ans*=base;
  22. base*=base;
  23. x>>=1;
  24. }
  25. return ans;
  26. }
  27. LL p ,lp,d;
  28. int main()
  29. {
  30. while(scanf("%I64d%I64d",&p,&d)==2){
  31. lp=p-d;
  32. int dig1=getdig(p),dig2=getdig(lp),i,j;
  33. if(dig2<dig1){
  34. int sign=1;
  35. for(i=0;i<dig1-1;i++)
  36. if((p/mpow10(i))%10!=9)sign=0;
  37. if(sign)printf("%I64d",p);
  38. else{
  39. if(p/mpow10(dig1-1)-1!=0)printf("%I64d",p/mpow10(dig1-1)-1);
  40. for(i=1;i<dig1;i++)printf("9");
  41. }
  42. }
  43. else {
  44. for(i=dig1-1;i>=0;i--)
  45. if(p/mpow10(i)!=lp/mpow10(i))break;
  46. int sign=1;
  47. for(j=i-1;j>=0;j--)
  48. if((p/mpow10(j))%10!=9)sign=0;
  49. if(sign||i<0)printf("%I64d",p);
  50. else {
  51. printf("%I64d",p/mpow10(i)-1);
  52. for(j=i-1;j>=0;j--)
  53. printf("9");
  54. }
  55. }
  56. putchar(10);
  57. }
  58. return 0;
  59. }

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读