c++编程:科学计数法(1024-PAT乙级)

张开发
2026/4/4 17:29:52 15 分钟阅读
c++编程:科学计数法(1024-PAT乙级)
PAT乙级-1024科学计数法string t s.substr(1, i-1);s科学计数法字符串例如 1.23400E-03i字符 E 在字符串中的位置索引s.substr(1, i-1)从索引 1 开始取 i-1 个字符输入字符串 si (E的位置)s.substr(1, i-1)结果 t1.234E36从索引1取5个1.234-1.2E-55从索引1取4个1.21E23从索引1取2个11. 只指定起始位置提取到末尾string s Hello World; string t s.substr(6); // 从索引6开始到末尾 cout t; // 输出 World2. 指定起始位置和长度string s Hello World; string t s.substr(0, 5); // 从索引0开始取5个字符 cout t; // 输出 Hello3. 提取中间部分string s Hello World; string t s.substr(6, 3); // 从索引6开始取3个字符 cout t; // 输出 Worstoi()— 字符串转整数函数string sub 4; int n stoi(sub); // n 4to_string()— 将数字类型转换为字符串int num 456; string str to_string(num); // str 456#includebits/stdc.h using namespace std; int main() { string s; // 定义字符串 s用于存储科学计数法表示的数值 cin s; // 输入科学计数法字符串格式如 1.23400E-03 int i 0; // 初始化索引 i while(s[i] ! E) { // 找到字符 E 的位置 i; // 索引递增直到遇到 E } // 循环结束后i 就是 E 字符的索引位置 // 提取底数部分不包含符号和 E // substr(1, i-1)从索引1开始长度为 i-1跳过第0位的符号位 string temp s.substr(1, i-1); // 提取指数部分从 E 后面开始转换为整数 int n stoi(s.substr(i1)); // 处理底数的符号科学计数法的第一位是正负号 if(s[0] -) cout -; // 如果是负数先输出负号 // 情况1指数为负数小数点向左移动 if(n 0) { cout 0.; // 输出 0. 前缀 // 输出 abs(n)-1 个前导零 // 例如 n-3则输出 2 个零 for(int k 0; k abs(n) - 1; k) { cout 0; } // 输出底数部分的所有数字跳过小数点 // temp 格式如 1.234j从2开始跳过 1. for(int j 2; j temp.length(); j) { cout temp[j]; // 输出 2,3,4... } } // 情况2指数为非负数小数点向右移动 else { cout temp[0]; // 输出底数的整数部分小数点前的数字 // 子情况2.1指数足够大不需要小数点 // temp.length() - 2 是底数的小数部分位数 if(n temp.length() - 2) { // 输出全部小数部分 for(int k 2; k temp.length(); k) { cout temp[k]; } // 补零需要补 n - 小数部分位数 个零 for(int k 0; k n - (temp.length() - 2); k) { cout 0; } } // 子情况2.2指数不够大需要加小数点 else { // 输出前 n 位小数部分 for(int k 2; k 2 n; k) { cout temp[k]; } // 输出小数点 cout .; // 输出剩余的小数部分 for(int k 2 n; k temp.length(); k) { cout temp[k]; } } } return 0; }指数足够大不需要小数点1.234E4int main(){ string s; cin s;// 输入: 1.234E4int i 0; while(s[i] ! E) { i; // i1,2,3,4,5,6 (最终 i6) } string temp s.substr(1, i-1);// temp 1.234int n stoi(s.substr(i1));// n 4if(s[0] -) cout -; // s[0]不输出 if(n 0) { // n4 ≥0进入 else // 负数指数分支不执行 } else { cout temp[0];// 输出 1 → 输出: 1if(n temp.length() - 2) { // temp.length()5, 5-23, 43 为真 for(int k 2; k temp.length(); k) { cout temp[k];// 依次输出 temp[2]2, temp[3]3,temp[4]4 }// 输出 234 → 当前输出: 1234for(int k 0; k n - (temp.length() - 2); k) { cout 0;// n-(5-2)4-31输出 1 个 0}// 输出 0 → 当前输出: 12340} else { // 需要小数点的分支不执行 } } return 0; // 最终输出: 12340 }指数不够大需要小数点1.234E1int main(){ string s; cin s;// 输入: 1.234E1int i 0; while(s[i] ! E) { i; // i1,2,3,4,5 (最终 i5) } string temp s.substr(1, i-1);// substr(1,4) → temp 1.234int n stoi(s.substr(i1)); // s.substr(6) → 1 →n 1if(s[0] -) cout -; // s[0]不输出 if(n 0) { // n1 ≥0进入 else // 负数指数分支不执行 } else { cout temp[0];// temp[0]1 → 输出 1if(n temp.length() - 2) { // temp.length()5, 5-23, 13 为假进入 else // 不需要小数点的分支不执行 } else { for(int k 2; k 2 n; k) { // 2n3k2 到 2 cout temp[k];// temp[2]2 → 输出 2}// 当前输出: 12cout .;// 输出 . → 当前输出: 12.for(int k 2 n; k temp.length(); k) { // 213k3 到 4 cout temp[k];// temp[3]3, temp[4]4 → 输出34 }// 当前输出: 12.34} } return 0; // 最终输出: 12.34 }

更多文章