fork download
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int notation(string str1,string str2,int N)
  5. {
  6. int e=0;//定义e作为返回结果
  7. int pos =0;//用来记录下标无用的0最后出现的位置
  8. //除去前面无用的0
  9. for(int i=0;i<(int(str1.length())-1);i++)//长度减一是为了防止出现全是0的情况
  10. {
  11. if(str1[i]=='0'&&str1[i+1]!='.')
  12. pos++;
  13. }
  14. str1.erase(str1.begin(),str1.begin()+pos);
  15.  
  16. int n=0;//记录已被记录的数的个数
  17. int i=0;//用来记录下标所到位置
  18. //如果除去无用0后开头不是0时,就开始记录前面N个数,让e等于小数点前数字的个数
  19. if(str1[0]!=0)
  20. {
  21. while(i<int(str1.length())&&n<N)
  22. {
  23. if(str1[i]!='.')
  24. str2[n++]=str1[i];
  25. i++;
  26. }
  27. i=0;
  28. while(str1[i]!='.'&&i<int(str1.length()))
  29. e++;
  30. }
  31. //如果除去无用0后开头为0
  32. else
  33. {
  34. //记录所前面N个不为0的数
  35. while(i<int(str1.length())&&n<N)
  36. {
  37. if(str1[i]!='0'&&str1[i]!='.')
  38. str2[n++]=str1[i];
  39. }
  40. //如果记录后长度还是为0,就让计数为0,e为0
  41. if(n==0)
  42. {
  43. for(n=0;n<N;n++)
  44. str2[n]='0';
  45. }
  46. //否则让e为小数点后0的个数
  47. else
  48. {
  49. int j=0;
  50. while(str1[j]==0)
  51. j++;
  52. e=-(j-2);
  53. }
  54. }
  55. return e;
  56. }
  57. //输出处理
  58. void show(string str,int N,int e)
  59. {
  60. if(int(str.length())==N)
  61. {
  62. cout<<"0."<<str<<"*10^"<<e<<endl;
  63. }
  64. else
  65. {
  66. cout<<"0."<<str;
  67. for(int i=0;i<(N-int(str.length()));i++)
  68. cout<<"0";
  69. cout<<"*10^"<<e<<endl;
  70. }
  71. }
  72. int main()
  73. {
  74. int N;
  75. string str1,str2;
  76. cin>>N>>str1>>str2;
  77. string str3,str4;
  78. //生产科学计数,以及e
  79. int e1=notation(str1,str3,N);
  80. int e2=notation(str2,str4,N);
  81. //比较大小并进行输出
  82. if(e1!=e2||str3!=str4)
  83. {
  84. cout<<"no";
  85. show(str3,N,e1);
  86. show(str4,N,e2);
  87. }
  88. else
  89. {
  90. cout<<"no";
  91. show(str4,N,e2);
  92. }
  93. }
Time limit exceeded #stdin #stdout 5s 15240KB
stdin
5 421212.0212 1213.0123
stdout
Standard output is empty