zoukankan      html  css  js  c++  java
  • 暑假集训Day22 I (模拟+高精度)

    题目链接在这里:200202.pdf (codeforces.com)

    其实思路非常好想,就是每次折半,把前一半回文到后面,这样的复杂度是log肯定可以行得通。然后如果最后剩的是10的话要特判一下

    需要注意的是如果在结构体里面开很大的数组比如1e5以上的话会很有可能RE

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 const int MAX=1e5+5;
     4 int t,ls1,ls2;
     5 char s1[MAX],s2[MAX];
     6 vector <string> ans;
     7 int main(){
     8     freopen ("i.in","r",stdin);
     9     freopen ("i.out","w",stdout);
    10     int i,j,mid;
    11     scanf("%d",&t);
    12     while (t--){
    13         scanf("%s",s1+1);
    14         ls1=strlen(s1+1);
    15         reverse(s1+1,s1+ls1+1);
    16         ans.clear();
    17         while (ls1){
    18             if (ls1==2 && s1[2]=='1' && s1[1]=='0'){
    19                 ans.push_back("1");
    20                 ans.push_back("9");
    21                 break;
    22             }
    23             if (ls1==1){
    24                 ans.push_back(string(1,s1[1]));
    25                 break;
    26             }
    27             mid=ls1/2;
    28             memset(s2,0,sizeof(s2));
    29             for (i=ls1;i>mid;i--) s2[i]=s1[i];
    30             s2[mid]--;
    31             i=mid;
    32             while (s2[i]<'0'){
    33                 s2[i]+=10;
    34                 s2[i+1]--;
    35                 i++;
    36             }
    37             if (s2[ls1]=='0'){
    38                 for (i=1;i<=mid;i++) s2[i]=s2[ls1-1-i+1];
    39                 if (ls1%2==0) s2[mid]='9';
    40                 ans.push_back(string(s2+1,s2+ls1));
    41             }
    42             else{
    43                 for (i=1;i<=mid;i++) s2[i]=s2[ls1-i+1];
    44                 ans.push_back(string(s2+1,s2+ls1+1));
    45             }
    46             for (i=1;i<=ls1;i++){
    47                 s1[i]=s1[i]-(s2[i]-'0');
    48                 if (s1[i]<'0'){
    49                     s1[i]+=10;
    50                     s1[i+1]--;
    51                 }
    52             }
    53             while (s1[ls1]=='0' && ls1) ls1--;
    54         }
    55         printf("%d
    ",ans.size());
    56         for (i=0;i<ans.size();i++)
    57             cout<<ans[i]<<endl;
    58     }
    59     return 0;
    60 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    多个div并排显示的居中问题——来自腾讯的一道面试题
    c++ 类的对象与指针
    c++ 联合体
    用户输入一个数字,找到所有能够除尽它的数的总个数
    javascript
    今天的排版
    论学习php的方法
    我想对所有新程序员说的一些话
    注册表单
    安卓机器人
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/15186890.html
Copyright © 2011-2022 走看看