五月初找到了实习就不想再动了,希望还没有找到实习地方的继续加油,在暑假里好好复习,肯定好机会不会错过你们的!闲蛋就不扯了。下面的两个小程序是前天两人去华为机试的同学讲给我听的。总的来说考的都比较基础,但是一定要想全面喽
1. 写一个十七进制转10进制的方法。
涉及到输入数据合不合法。当然还有溢出问题
#include <iostream> #include <string> #include <ctype.h> using std::cout; using std::cin; using std::string; /* 返回值显示转换是否成功 */ bool seventeen_2_dec(const string & str,int & result); /* 十七制字母转换 */ inline int seventeen_2_singdec(const char single); int main() { string test; cout<<"请输入要转换的数\n"; cin>>test; int convter_result=0; if (!seventeen_2_dec(test,convter_result)) { cout<<"输入有误,无法转换\n"; }else cout<<"结果是"<<convter_result; system("pause"); return 0; } bool seventeen_2_dec(const string & str,int& result) { bool isSuccess=false; bool negative=false; //指示是否是负数 int limit; int mulimt; int tmp; if (str.empty() || str.length()==0) { return isSuccess; } //首先将字符串前面的0去掉 size_t start_index=0; size_t end=str.length(); int sum=0; if (str.at(start_index)=='-') { negative=true; limit=INT_MIN; start_index++; }else { limit=-INT_MAX; } while(str.at(start_index)=='0') start_index++; if (start_index < end) { tmp = seventeen_2_singdec(str.at(start_index++)); if (tmp < 0) { return false; } else { sum = -tmp; } } int multlimit=limit/17; for (;start_index<end;start_index++) { tmp=seventeen_2_singdec(str.at(start_index)); if (tmp==-1) return false; if (sum<multlimit) { sum=limit; break; } sum*=17; if (sum<(limit+tmp)) { sum=limit; break; } sum-=tmp; } if (negative) { result=sum; }else result=-sum; return true; } inline int seventeen_2_singdec(const char single) { int tmp=toupper(single); if (tmp>='0' && tmp<='9') { return tmp-'0'; } if (tmp>='A' && tmp<='G') { return 10+tmp-'A'; } return -1; }
2.从键盘接受一个字符串,然后将字符串中的 * 全部换成0。同时还要将转换后的字符串无用的0去掉。比如 00123变成123 00.7800900变成 0.7809也就是实数的形式
废话就不说了,就是逻辑要考虑完全,下面是java代码
import java.util.regex.Pattern; public class MyChange { public static void main(String[] args) { /* ***.*** * **.09.089 * -*09730A * 90*700000 * -89*0.**00* */ System.out.println(parse("-**.**")); } private static String parse(String input) { // 先前过滤 if (input == null || input.trim().length() == 0) return null; // 首先替换 String replaced = input.replace('*', '0'); // 然后检测合法性 if (!check(replaced)) return null; int index = replaced.indexOf('.'); // 如果是整数 if (index < 0) return parseInteger(replaced); else return parseFloat(replaced); } // 处理整数 private static String parseFloat(String replaced) { // 有两种情况 1. 小数点前面全是0 ,这种情况保留一个0 // 2. .小数点后面全是0 去点小数点和0 char startChar = replaced.charAt(0); int start = 0; String boxStart = ""; if (startChar == '-') { start = 1; boxStart = "-"; } int dotIndex = replaced.indexOf('.'); // 说明至少有两个 . if (replaced.indexOf('.', dotIndex+1) >= 0) return null; String left = replaced.substring(start, dotIndex); String right = replaced.substring(dotIndex + 1); // 对于左边的,去掉连续的0,如果全是0,保留一个 int leftIndex = 0; int len=left.length(); while (leftIndex<len &&left.charAt(leftIndex) == '0') ++leftIndex; if (leftIndex == left.length()) left = "0"; else left = left.substring(leftIndex); // 重用一下 leftIndex = right.length() - 1; while (leftIndex>=0 &&right.charAt(leftIndex) == '0' ) --leftIndex; if (leftIndex == -1) right = ""; // 说明右边全是0,这样把右边置空 else right = right.substring(0, leftIndex + 1); if (right == ""){ if(left=="0") return "0"; return boxStart + left; } else return boxStart + left + '.' + right; } // 处理小数 private static String parseInteger(String replaced) { // 消除左边连续的0 char startChar = replaced.charAt(0); int start = 0; String boxStart = ""; // 对于第一个字符的包装,免得后面return的时候还要判断 if (startChar == '-') { start = 1; boxStart = "-"; } int len=replaced.length(); while( start<len&& replaced.charAt(start)=='0' ) ++start; // 说明全部是0 if (start == len) return "0"; else { return boxStart + replaced.substring(start); } } // 检测合法性 private static boolean check(String input) { return input.matches("[-]?[\\d]*[\\.]?[\\d]*"); } }