机试准备第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;//记录改变后s
for(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){
//列举出不交换的情况为true
if(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 。