• 1024 科学计数法


    一.问题:

     科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

    现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

    输入格式:

    每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

    输出格式:

    对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

    输入样例 1:

    +1.23400E-03
    

    输出样例 1:

    0.00123400
    

    输入样例 2:

    -1.2E+10
    

    输出样例 2:

    -12000000000

    二.思路:

    三.代码实现:

    1. #include
    2. #include
    3. #include
    4. //将指数字符串zhishu部分转换为int数字
    5. int switch_num(char*num_str)
    6. {
    7. int len_s = strlen(num_str);
    8. int e = 0;
    9. int move = 0;
    10. for(int i = len_s-1;i > -1;i--,e++)
    11. {
    12. move = move + (num_str[i]-'0')*pow(10,e);
    13. }
    14. return move;
    15. }
    16. int main()
    17. {
    18. //定义需要的变量
    19. char science_num[10001];//输入的以科学计数法表示的实数
    20. char sign1;//第一个正负符号
    21. char sign2;//第二个正负符号
    22. char num[10001]={'\0'};//科学计数法表示的实数中的除了指数部分的数字
    23. char zhishu[10001]={'\0'};//科学计数法表示的实数中的指数部分的数字
    24. //输入数据
    25. scanf("%s",science_num);
    26. //提取每个变量的值
    27. //1.提取第一个正负符号sign1
    28. sign1 = science_num[0];
    29. int len1 = strlen(science_num);//以科学计数法表示的实数字符串长度
    30. int index = 0;//记录字符E出现的下标
    31. for(int i = 0;science_num[i] != '\0';i++)
    32. {
    33. if(science_num[i] == 'E')
    34. {
    35. index = i;
    36. //2.提取第二个正负符号sign2
    37. sign2 = science_num[i+1];
    38. //3.科学计数法表示的实数中的指数部分zhishu的数字字符串
    39. for(int j = i+2,m=0;science_num[j] != '\0';j++)
    40. {
    41. zhishu[m] = science_num[j];
    42. m++;
    43. }
    44. break;
    45. }
    46. }
    47. for(int i = 1,t=0;i < index;i++)
    48. {
    49. //4.提取科学计数法表示的实数中的除了指数部分的数字num字符串
    50. if(science_num[i] >= '0'&&science_num[i] <= '9')
    51. {
    52. num[t] = science_num[i];
    53. t++;
    54. }
    55. }
    56. //输出转换后的普通数字表示法的数
    57. //1.输出第一个符号
    58. if(sign1 == '-')
    59. {
    60. putchar('-');
    61. }
    62. //2.输出剩余部分
    63. //2.1先获取指数绝对值,即小数点移动步数和num字符串长度len2
    64. int move = switch_num(zhishu);
    65. int len2 = strlen(num);
    66. if(move == 0)//原样输出,小数点不移动
    67. {
    68. printf("%c",num[0]);
    69. putchar('.');
    70. for(int k = 1;k < len2;k++)
    71. {
    72. putchar(num[k]);
    73. }
    74. }
    75. else //move > 0的情况
    76. {
    77. if(sign2=='+')//小数点右移的情况
    78. {
    79. if(move < len2-1)//小数点移动步数没有超过小数部分的情况
    80. {
    81. for(int k = 0;k <= move;k++)
    82. {
    83. putchar(num[k]);
    84. }
    85. putchar('.');
    86. for(int k = move+1;k < len2;k++)
    87. {
    88. putchar(num[k]);
    89. }
    90. }
    91. else
    92. {
    93. printf("%s",num);
    94. for(int k = 0;k < (move-len2+1);k++)
    95. {
    96. putchar('0');
    97. }
    98. }
    99. }
    100. else //小数点左移的情况
    101. {
    102. printf("0.");
    103. for(int k = 0;k < (move-1);k++)
    104. {
    105. putchar('0');
    106. }
    107. printf("%s",num);
    108. }
    109. }
    110. putchar('\n');
    111. return 0;
    112. }

  • 相关阅读:
    Electron之集成vue+vite开发桌面程序
    C语言二维数组定义、赋值、按要求遍历操作、输出以及函数调用
    Django后端开发——中间件
    4D毫米波雷达和3D雷达、激光雷达全面对比
    设计模式学习(五):原型模式
    pytest --version报错
    安装MYSQL遇到问题:write configuration file卡主
    【栈和队列OJ】一、有效的括号
    力扣每日一题:最接近目标价格的甜点成【dfs 暴力搜索】
    Aspose.total帮助某软件公司程序实现高效自定义文档操作
  • 原文地址:https://blog.csdn.net/2303_76295261/article/details/133581929