将一个字符串中(没有空格)用科学计数法表示的数串转 换成对应的实数,结果保留 6 位小数。 输入仅一个字符串,该字符串中仅有一个用科学计数法表示的数据串。 输入 一个字符串中(字符中不含空格)包含
令不才的我煞费苦心. 将一个字符串中(没有空格)用科学计数法表示的数串转 换成对应的实数,结果保留 6 位小数。 输入仅一个字符串,该字符串中仅有一个用科学计数法表示的数据串。 输入 一个字符串中(字符中不含空格)包含 一个 用 科学计数法 表示的 数串(它的意思是从一段文字中要解析处数字的部分并进行转化,(默认是十进制的.)) 输出 科学计数法表示的数串对应的实数 样例输入 abc1.32e+2defg abc 1.32e+2 defg 样例输出 132.000000 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <ctype.h> //在此下方插入自定义函数对的声明: int is_legal_num_string(char *str, int digital_index_1st, int digital_index_last) { int num_E_e = 0, index_E_e = -1; //index为了判断先后性. int num_pointer = 0, index_pointer = -1; /*下面的i任然是匹配于最原始的str中的索引 */ for (int i = digital_index_1st; i <= digital_index_last; i++) { /* 检查内部是否出现非法字符 */ if (str[i] != 'e' && str[i] != 'E' && str[i] != '.' && !isdigit(str[i]) && str[i] != '+' && str[i] != '-') { return 0; } else if (str[i] == 'e' || str[i] == 'E') { num_E_e++; if (index_E_e == -1) { index_E_e = i; } } else if (str[i] == '.') { num_pointer++; if(index_pointer == -1) { index_pointer = i; } /* code */ } if (num_pointer > 1 || num_E_e > 1 || (index_pointer > index_E_e && index_E_e != -1)) { return 0; } } return 1; /* 对'e','E','.'的重复性格检查. */ } //主函数main int main() { //复制模版式删除这个或者上面那个 char str[100]; //根据需要分配更大的维数 //while(scanf("%s",str) != EOF , str == " xxx")判断读到了什么;while(gets(str)); while (scanf("%s", str) != EOF) { int len = strlen(str); int digit_1st_index = -1; int digit_last_index = -1; int e_index = -1; // int part1 = 0;用来存储float将导致信息损失. // int part2 = 0; float part1 = 0; float part2 = 0; float result = 0; float signal_1 = +1.0; /* 处理正负数的. 但在定义的时候要定义为float,否则int 下 1.0没用,还是1*/ float signal_2 = +1.0; /* 处理指数部分的正负. */ int i = 0;//小心放置. int j = 0; while (1) { digit_1st_index = -1; digit_last_index = -1; e_index = -1; // int part1 = 0;用来存储float将导致信息损失. // int part2 = 0; part1 = 0; part2 = 0; result = 0; i = j;//记录着经过了多少次for: for (; i < len; i++) { /* isdigit是计算机C(C++)语言中的一个函数,主要用于检查其参数 (某个ascii码 是否为十进制数字字符。 */ /* 记录第一个数字字符出现的位置. */ if (isdigit(str[i]) && digit_1st_index == -1) { digit_1st_index = i; } /* 找出科学计数法中出现e/E的位置 */ if ((str[i] == 'e' || str[i] == 'E') && digit_1st_index != -1) { e_index = i; } /* 找出最该可能是科学计数法表示的数串 的 最后一个数码 */ if (e_index != -1 && isdigit(str[i]) && !isdigit(str[i + 1])) { digit_last_index = i; break; /*abc1.32e+2defg */ } } /* before deal,judge the number_string is legal? */ /* 如果的到了否定的结果,那就从下一个起始字符再判断. */ if (is_legal_num_string(str, digit_1st_index, digit_last_index)) { int change_char_to_int = 0; /* deal part1: */ for (int i = digit_1st_index; i < e_index; i++) { if (str[i] != '.') { change_char_to_int = str[i] - 48; part1 = change_char_to_int + part1 * 10; } } if (str[digit_1st_index] == '-') { signal_1 = -1; } int setoff_point = e_index - digit_1st_index - 2; part1 = signal_1 * part1 / (float)(pow(10, setoff_point)); /* deal part2: */ int state = 0; /* 默认没有符号位. */ if (!isdigit(str[e_index + 1])) { if (str[e_index + 1] == '-') { signal_2 = -1; } /* 符号位需要占一位. */ state = 1; } for (int j = e_index + state + 1; j <= digit_last_index; j++) { change_char_to_int = str[j] - 48; part2 = change_char_to_int + part2 * 10; part2 *= signal_2; } result += part1 * pow(10, part2); printf("%.6f\n", result); break; }//if j++; // else // { // ; // } } //while(1) } //while(scanf) return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-12-12 CN_@TCP可靠机制@差错控制@流量控制@拥塞控制
2021-12-12 java_Fabonacci斐波那契数列
2021-12-12 CN_TCP_协议分析_wireShark分析报文(reserve+flags)