机试准备第11天
第一题是浮点数加法,目前写过最长的代码。
#include <stdio.h>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main() {string str1;string str2;while (getline(cin, str1) && getline(cin, str2)) { //读入两个数int pointpos1, pointpos2; //确定小数点位置for (int i = 0; i < str1.size(); i++) {if (str1[i] == '.') pointpos1 = i;}for (int i = 0; i < str2.size(); i++) {if (str2[i] == '.') pointpos2 = i;}//分割小数部分与整数部分string integer1;string intrger2;string xiaoshu1;string xiaoshu2;integer1 = str1.substr(0, pointpos1);intrger2 = str2.substr(0, pointpos2);xiaoshu1 = str1.substr(pointpos1, str1.size() - pointpos1);xiaoshu2 = str2.substr(pointpos2, str2.size() - pointpos2);//将小数转化为0.XXXXX,位数相同的形式xiaoshu1.insert(0, "0");xiaoshu2.insert(0, "0");int size1 = xiaoshu1.size();int size2 = xiaoshu2.size();if (size1 > size2) {for (int i = 0; i < (size1 - size2); i++) {xiaoshu2.push_back('0');}} else if (size2 > size1) {for (int i = 0; i < (size2 - size1); i++) {xiaoshu1.push_back('0');}}//将小数填充为位数相同xiaoshu1.erase(xiaoshu1.begin() + 1);xiaoshu2.erase(xiaoshu2.begin() + 1);int size3 = xiaoshu1.size();string xiaoshu3 = xiaoshu1;vector<int> jingwei(size3);for (int i = 0; i < size3; i++) {jingwei[i] = 0;}for (int i = size3 - 1; i >= 1; i--) {if ((xiaoshu1[i] - '0') + (xiaoshu2[i] - '0') + jingwei[i] >= 10) {jingwei[i - 1]++;xiaoshu3[i] = '0' + ((xiaoshu1[i] - '0') + (xiaoshu2[i] - '0') - 10) +jingwei[i];} else xiaoshu3[i] = '0' + ((xiaoshu1[i] - '0') + (xiaoshu2[i] - '0')) +jingwei[i];}int zhengshujingwei = 0;if (jingwei[0] == 1) zhengshujingwei = 1;xiaoshu3[0] = '.';//printf("%d", zhengshujingwei);int sizeofzhengshu1 = integer1.size();int sizeofzhengshu2 = intrger2.size();if (sizeofzhengshu1 > sizeofzhengshu2) {for (int i = 0; i < (sizeofzhengshu1 - sizeofzhengshu2); i++) {intrger2.insert(0, "0");}} else if (sizeofzhengshu2 > sizeofzhengshu1) {for (int i = 0; i < (sizeofzhengshu2 - sizeofzhengshu1); i++) {integer1.insert(0, "0");}}integer1.insert(0, "0");intrger2.insert(0, "0");
// printf("%s\n",integer1.c_str());
// printf("%s\n",intrger2.c_str());int size5 = integer1.size();vector<int> jingwei2(size5);for (int i = 0; i < size5; i++) {jingwei2[i] = 0;}string res = integer1;for (int i = size5 - 1; i >= 1; i--) {if (i == (size5 - 1)) {if (((integer1[i] - '0') + (intrger2[i] - '0') + zhengshujingwei) + jingwei2[i]>= 10) {jingwei2[i - 1]++;res[i] = '0' + (integer1[i] - '0') + (intrger2[i] - '0') - 10 + jingwei2[i] +zhengshujingwei;} else {res[i] = '0' + (integer1[i] - '0') + (intrger2[i] - '0') + jingwei2[i] +zhengshujingwei;}} else {if ((integer1[i] - '0') + (intrger2[i] - '0') + jingwei2[i] >= 10) {jingwei2[i - 1]++;res[i] = '0' + (integer1[i] - '0') + (intrger2[i] - '0') - 10 + jingwei2[i];} else {res[i] = '0' + (integer1[i] - '0') + (intrger2[i] - '0') + jingwei2[i];}}}//printf("%s\n", res.c_str());if (jingwei2[0] == 1) res[0] = 1;else res.erase(res.begin());//printf("%s\n", res.c_str());//printf("%s\n", res.c_str());printf("%s", (res + xiaoshu3).c_str());}
}
第二题是w的密码。燃尽了。
#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
#include <map>
using namespace std;
struct Word{char letter;int seq;
};
int main(){int k1,k2,k3;while(scanf("%d%d%d", &k1, &k2, &k3)!=EOF){cin.ignore();if(k1==0&&k2==0&&k3==0) break;string str1;getline(cin, str1);//读入字符串vector<Word> vec1;//第一组别字母的原始位置vector<Word> vec2;vector<Word> vec3;for(int i = 0; i<str1.size();i++){Word mid;mid.letter = str1[i];mid.seq = i;if(str1[i]>='a'&&str1[i]<='i') vec1.push_back(mid);else if(str1[i]>='j'&&str1[i]<='r') vec2.push_back(mid);else if((str1[i]>='s'&&str1[i]<='z')||str1[i]=='_') vec3.push_back(mid);}//记录3个组别元素出现的位置vector<Word> res1;//各组别字母的变换后位置vector<Word> res2;vector<Word> res3;for(int i = 0; i< vec1.size();i++){Word mid;mid.letter = vec1[(i+vec1.size() - (k1%vec1.size()))%vec1.size()].letter;mid.seq = vec1[i].seq;res1.push_back(mid);}for(int i = 0; i< vec2.size();i++){Word mid;mid.letter = vec2[(i+vec2.size() - (k2%vec2.size()))%vec2.size()].letter;mid.seq = vec2[i].seq;res2.push_back(mid);}for(int i = 0; i< vec3.size();i++){Word mid;mid.letter = vec3[(i+vec3.size() - (k3%vec3.size()))%vec3.size()].letter;mid.seq = vec3[i].seq;res3.push_back(mid);}map<int, char> map1;//记录改变后sfor(int i = 0; i < res1.size();i++){map1.insert({res1[i].seq, res1[i].letter});}for(int i = 0; i < res2.size();i++){map1.insert({res2[i].seq, res2[i].letter});}for(int i = 0; i < res3.size();i++){map1.insert({res3[i].seq, res3[i].letter});}for(int i = 0; i<str1.size();i++){str1[i] = map1[i];}
// for(int i = 0; i<res1.size();i++){
// printf("%c",res1[i].letter);
// }printf("%s\n", str1.c_str());}
}
第三题是寻找变化前的01序列。
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main(){int n;scanf("%d", &n);for(int i = 0; i < n;i++){char arr[200];scanf("%s", arr);string str = arr;int res = 0;for(int i = 0; i<str.size();i++){if(res == 5) res=0;else {if(str[i]=='1') res++;else res=0;printf("%c", str[i]);}}printf("\n");}
}
第四题是复制剪切。
#include <stdio.h>
#include <string>
using namespace std;
void copy(string &str, string &t, int l, int r){t.clear();for(int i =l; i<=r;i++){t.push_back(str[i]);}printf("%s\n", str.c_str());
}
void cut(string &str, string &t, int l, int r){t.clear();t = str.substr(l, r-l+1);string cutafter;for(int i = 0;i < str.size();i++){if(i <l || i>r) cutafter.push_back(str[i]);}str = cutafter;printf("%s\n", str.c_str());
}
void paste(string &str, string &t, int pos){str.insert(pos+1, t);printf("%s\n", str.c_str());
}
int main(){char arr[200];scanf("%s", arr);string str = arr;int n;scanf("%d", &n);string t;for(int i = 0;i<n;i++){char arr1[10];scanf("%s",arr1);//读入控制符string oper = arr1;if(oper == "COPY") {int l1,r1;scanf("%d%d", &l1, &r1);copy(str, t, l1,r1);}else if(oper == "CUT") {int l2,r2;scanf("%d%d", &l2, &r2);cut(str, t , l2, r2);}else if(oper == "PASTE") {int pos;scanf("%d", &pos);paste(str, t, pos);}}
}
第五题是skew数。
#include <stdio.h>
#include <string>
#include <cmath>
using namespace std;
int main() {char arr[100];while (scanf("%s", arr) != EOF) {string str = arr;long res = 0;int shuwei = 1;for (int i = str.size() - 1; i >= 0; i--) {res += (str[i] - '0') * (pow(2,shuwei) - 1);shuwei++;}printf("%ld\n", res);}
}
第六题是首字母大写,记住大写字母的ASCII值是小写字母的-32就行。
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main() {string str;while (getline(cin, str)) {if (str[0] >= 'a' && str[0] <= 'z') str[0] = str[0] - 32;for (int i = 1; i < str.size(); i++) {if (str[i - 1] == ' ' || str[i - 1] == '\t' || str[i - 1] == '\r' ||str[i - 1] == '\n') {if (str[i] >= 'a' && str[i] <= 'z') str[i] = str[i] - 32;}}printf("%s\n", str.c_str());}
}
第七题是大整数排序,注意cmp函数的返回值。
#include <stdio.h>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool cmp(string left, string right){//列举出不交换的情况为trueif(left.size()<right.size()) return true;else if(left.size() == right.size()){for(int i = 0;i<left.size();i++){if(left[i]<right[i]) return true;else if(left[i]>right[i]) return false;}}else return false;
}
int main(){int n;scanf("%d", &n);vector<string> vec1;for(int i = 0; i <n;i++){char arr[2000];scanf("%s",arr);string str = arr;vec1.push_back(str);//读入所有整数}sort(vec1.begin(), vec1.end(),cmp);for(int i = 0; i<vec1.size();i++){printf("%s\n", vec1[i].c_str());}
}
字符串函数总结:substr(beginpos, len),insert(beginpos, string),erase(size_t pos = 0, size_t n = npos),erase(iterator first, iterator last),find(const string &s, int pos=0)在 string 字符串中 , 从 pos 索引位置 ( 包括该位置索引自身 ) 开始查找 string 类型字符串 s 在当前字符串的位置 , 如果没有查到就返回 -1 。