c++编程:科学计数法(1024-PAT乙级)
PAT乙级-1024:科学计数法
string t = s.substr(1, i-1);s:科学计数法字符串,例如 "+1.23400E-03"
i:字符 'E' 在字符串中的位置索引
s.substr(1, i-1):从索引 1 开始,取 i-1 个字符
| 输入字符串 s | i (E的位置) | s.substr(1, i-1) | 结果 t |
|---|---|---|---|
"+1.234E+3" | 6 | 从索引1取5个 | "1.234" |
"-1.2E-5" | 5 | 从索引1取4个 | "1.2" |
"+1E+2" | 3 | 从索引1取2个 | "1" |
1. 只指定起始位置(提取到末尾)
string s = "Hello World"; string t = s.substr(6); // 从索引6开始到末尾 cout << t; // 输出 "World"
2. 指定起始位置和长度
string s = "Hello World"; string t = s.substr(0, 5); // 从索引0开始,取5个字符 cout << t; // 输出 "Hello"
3. 提取中间部分
string s = "Hello World"; string t = s.substr(6, 3); // 从索引6开始,取3个字符 cout << t; // 输出 "Wor"
stoi()— 字符串转整数函数
string sub = "+4"; int n = stoi(sub); // n = 4
to_string()— 将数字类型转换为字符串
int num = 456; string str = to_string(num); // str = "456"
#include<bits/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(i+1)); // 处理底数的符号(科学计数法的第一位是正负号) 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.234",j从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.234E+4
int main(){ string s; cin >> s;// 输入: +1.234E+4int i = 0; while(s[i] != 'E') { i++; // i=1,2,3,4,5,6 (最终 i=6) } string temp = s.substr(1, i-1);// temp = "1.234"int n = stoi(s.substr(i+1));// n = 4if(s[0] == '-') cout << '-'; // s[0]='+',不输出 if(n < 0) { // n=4 ≥0,进入 else // 负数指数分支(不执行) } else { cout << temp[0];// 输出 '1' → 输出: "1"if(n >= temp.length() - 2) { // temp.length()=5, 5-2=3, 4>=3 为真 for(int k = 2; k < temp.length(); k++) { cout << temp[k];// 依次输出 temp[2]='2', temp[3]='3',temp[4]='4' }// 输出 "234" → 当前输出: "1234"for(int k = 0; k < n - (temp.length() - 2); k++) { cout << '0';// n-(5-2)=4-3=1,输出 1 个 '0'}// 输出 "0" → 当前输出: "12340"} else { // 需要小数点的分支(不执行) } } return 0; // 最终输出: 12340 }指数不够大(需要小数点)
+1.234E+1
int main(){ string s; cin >> s;// 输入: +1.234E+1int i = 0; while(s[i] != 'E') { i++; // i=1,2,3,4,5 (最终 i=5) } string temp = s.substr(1, i-1);// substr(1,4) → temp = "1.234"int n = stoi(s.substr(i+1)); // s.substr(6) → "+1" →n = 1if(s[0] == '-') cout << '-'; // s[0]='+',不输出 if(n < 0) { // n=1 ≥0,进入 else // 负数指数分支(不执行) } else { cout << temp[0];// temp[0]='1' → 输出 "1"if(n >= temp.length() - 2) { // temp.length()=5, 5-2=3, 1>=3 为假,进入 else // 不需要小数点的分支(不执行) } else { for(int k = 2; k < 2 + n; k++) { // 2+n=3,k=2 到 2 cout << temp[k];// temp[2]='2' → 输出 "2"}// 当前输出: "12"cout << '.';// 输出 '.' → 当前输出: "12."for(int k = 2 + n; k < temp.length(); k++) { // 2+1=3,k=3 到 4 cout << temp[k];// temp[3]='3', temp[4]='4' → 输出"34" }// 当前输出: "12.34"} } return 0; // 最终输出: 12.34 }