东方博宜oj答案1101-1150_c++_always-like-a-star-开放原子开发者工作坊 (2024)

传送门

东方博宜oj答案1000-1050https://blog.csdn.net/like_astar/article/details/128881011

东方博宜oj答案1051-1100https://blog.csdn.net/like_astar/article/details/128984236?spm=1001.2014.3001.5502

东方博宜oj答案1101-1150_c++_always-like-a-star-开放原子开发者工作坊 (3)

(这是一张图片)

不知道之前插入链接是怎么搞的可以搞成这种形式,但是现在又不会了,有没有人可以教教我呜呜呜。

写在前面

后面的题目开始越来越难了,水平所限我也不敢说我每道都能做的出来,只能说尽量咯,加油

题目不是按顺序做的,也不是一天搞定的,所以可能有些时候状态不太好写出来的代码比较脑溢血还请多包涵。

1101

#include <iostream>#include <string>using namespace std;int main(){string str1, str2;getline(cin, str1);getline(cin, str2);int str1_h = ((str1[0] - 48) * 10 + (str1[1] - 48)) * 3600;//时->秒int str1_m = ((str1[3] - 48) * 10 + (str1[4] - 48)) * 60;//分->秒int str1_s = ((str1[6] - 48) * 10 + (str1[7] - 48));//秒int str1_sum = str1_h + str1_m + str1_s;int str2_h = ((str2[0] - 48) * 10 + (str2[1] - 48)) * 3600;//时->秒int str2_m = ((str2[3] - 48) * 10 + (str2[4] - 48)) * 60;//分->秒int str2_s = ((str2[6] - 48) * 10 + (str2[7] - 48));//秒int str2_sum = str2_h + str2_m + str2_s;cout << str1_sum - str2_sum;return 0;}

1102

原理其实就是冒泡排序,因为这种交换位置的逻辑和排序其实差不多

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);for (int i = 0; i < a.size()-1; i++){for (int j = 0; j < a.size() - i - 1; j++){if (a[j] != ' ' && a[j + 1] == ' '){int temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}for (int i = 0; i < a.size(); i++){cout << a[i];}return 0;}

1103

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num = 1;//当一个字母出现时它至少会出现一次for (int i = 0; i < a.size(); i++){if (a[i] == a[i + 1]){num++;}if (a[i] != a[i + 1])//当前后不相等时证明相同字母已经结束,开始结算{if (num != 1)//如果不分成num==1和num!=1的情况下,aabbbx会变成2a3b1x,而这个1是我们不想要的{cout << num;cout << a[i];num = 1;}else{cout << a[i];}}}return 0;}

1104

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num = 0;//本题思路核心int i;for (i = 0; i < a.size(); i++){if (a[i] >= 48 && a[i] <= 57)//判断是否为数字{//这题不能像上一题一样设初始值为1,因为字母前面的数字并不确定,比如说,如果是35a的话//那么先读3,然后再读数字的话,前面的三就要进位,也就是这里用到的*10,如果一直是数字//的话要一直进位知道下一个出现字母为止num = num * 10 + (a[i] - 48);}if ((a[i] >= 65 && a[i] <= 90) || (a[i] >= 97 && a[i] <= 122))//遇到英文,开始结算{if (num == 0)//讨论的方式和上一道题一样{cout << a[i];}else{for (int j = 1; j <= num; j++){cout << a[i];}num = 0;}}}return 0;}

1105

将重复的内容置为0并且在将原串录入新串的时候将0滤去

#include <iostream>#include <string>using namespace std;int main(){string a, b;getline(cin, a);getline(cin, b);string c;c = a + b;for (int i = 0; i < c.size() - 1; i++){for (int j = i + 1; j <= c.size(); j++){if (c[i] == c[j]){c[j] = 0;}}}string d;for (int i = 0; i < c.size(); i++){if (c[i] != 0){d += c[i];}}for (int i = 0; i < d.size(); i++){cout << d[i];}return 0;}

1106

开头不放空格还是比较友好的

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num = 1;for (int i = 0; i < a.size(); i++){if (a[i] == ' ' && a[i + 1] != ' '){num++;}}cout << num;return 0;}

1107

有点意思,但不多,不过想来这个方法一定是很复杂的

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);//分类讨论,第一个词,最后一个词,中间的词int num_first = 0;//用来记录第一个单词的字母数int num_last = 0;//用来记录最后一个单词的字母数int num_middle = 0;//用来记录中间单词的字母数int max_middle = 0;//用来记录中间最大字母数单词的字母数int location = 0;//用来记录中间最长单词的起始位置for (int i = 0;; i++)//第一个单词的字母数{if (a[i] != ' '){num_first++;}else{break;}}for (int i = a.size() - 1;; i--)//最后一个单词的字母数{if (a[i] != ' '){num_last++;}else{break;}}int work = 0;for (int i = 1; i < a.size()- num_last; i++){if (a[i] != ' ' && a[i - 1] == ' ')//检测到本身为字母但前面是空格,为单词开头,开始工作{work = 1;}if (work == 1){if ((a[i] >= 65 && a[i] < 90) || (a[i] >= 97 && a[i] <= 122))//大小写字母的ASCII码{num_middle++;}if (a[i] == ' '){if (max_middle < num_middle){max_middle = num_middle;//记录最大的location = i - num_middle;//记录位置num_middle = 0;//记得置0以便下一个单词的计数}work = 0;}}}if (num_first >= max_middle && num_first >= num_last)//第一个单词最大且前面的优先输出{for (int i = 0; i < num_first; i++){cout << a[i];}}else if (max_middle > num_first && max_middle >= num_last)//中间单词最大且前面的优先输出{for (int i = location; i < location + max_middle; i++){cout << a[i];}}else//最后一个单词{for (int i = a.size() - num_last; i < a.size(); i++){cout << a[i];}}return 0;}

下面是官方的题解,用了点小科技Isalpha,但是我不会呜呜呜

#include <iostream>#include <string>using namespace std;string s, w = "", ma = "";int main() {getline(cin, s);//循环每个字符 for (int i = 0; i < s.size(); i++) {//如果是字母,一定是单词的一部分if (isalpha(s[i])) {w = w + s[i];//如果单词结束if (i == s.size() - 1 || !isalpha(s[i + 1])) {//cout<<w<<endl;if (w.size() > ma.size()) ma = w;w = "";//清空单词存放下一个单词 }}}cout << ma;return 0;}

1108

并没有用到字符串(乐)

#include<iostream>using namespace std;int main() {int a[20];int num = 0;int length = 0;cin >> num;while (num / 2) {a[length] = num % 2;length++;num = num / 2;}a[length] = num;length++;for (int i = length - 1; i >= 0; i--){cout << a[i];}return 0;}

1109

需要注意如果是5555的话输出应该是0而不是0000,这是唯一的易错点

#include <iostream>#include <cmath>using namespace std;int main() {int n;cin >> n;int sum = 0;int a[4];a[0] = n / 1000;a[1] = n % 1000 / 100;a[2] = n % 1000 % 100 / 10;a[3] = n % 1000 % 100 % 10;for (int i = 3; i >= 0; i--){a[i] = (a[i] + 5) % 10;sum += pow(10, i) * a[i];}cout << sum;return 0;}

1110

#include <iostream>using namespace std;int main() {int n;cin >> n;int sum = 0;for (int i = 1; i <= n; i += 2){sum += i;}cout << sum;return 0;}

1111

#include <iostream>#include <string>using namespace std;int main(){//写在前面//这道题我的思路我觉得还是有点意思的,可能由于个人水平的原因我有些地方用的方法比较复杂还请见谅,思路很难用言语说出来,我一步一步解释//首先我们就拿题目给的测试案例 Her name is Lilan and she is a happy student.//1.从头开始读,读到第一个a(Lilan)停,往回回溯到该单词的第一个字母的位置也就是L//2.继续往后读,读完一整个单词,当遇见空格时停,记录首字母的位置以及单词长度(5)//3.与max_num比较,如果num更大就把num的值给max_num(因为max_num一开始为0所以肯定能赋值成功)//4.需要注意的是num在经过一次上述过程后要置0不然会一直加下去那就寄了//5.然后后面不断重复前面的操作就好了,直到结束即可,整道题不注意的话坑还是挺多的,在打的时候有可能超限也有可能死循环//6.最后祝大家早AC,有的点没有想到真的差点被折磨死了string a;getline(cin, a);a = ' ' + a;//在string前面加个空格好识别a[a.size() - 1] = ' ';a += '.';int loc = 0;int num = 0;//记录单词的字母个数int max_loc = 0;int max_num = 0;int i;if (a.find('a') > a.size()){cout << "NO";//没有a直接NO掉就可以了,find函数如果没有找到的话会返回一个超大的值return 0;}else{for (i = 0; i < a.size(); i++){for (i; i < a.size(); i++){if (a[i] == 'a'){break;}}for (i; i >= 0; i--){if (a[i] == ' '){loc = i + 1;break;}}for (i = i + 1; i < a.size(); i++){if (a[i] != ' '){num++;}else{if (max_num < num){max_num = num;max_loc = loc;}num = 0;break;}}}for (int i = max_loc; i < max_loc + max_num; i++){cout << a[i];}return 0;}}

1112

#include <iostream>#include <string>using namespace std;int main() {string a;//在指定串里查找string b;//要查找的串string c;//要替换成的新串getline(cin, a);getline(cin, b);getline(cin, c);//查找指定的串int pos;pos = a.find(b);while (!(pos > a.size())) //如果当find没有找到的话会给到一个很大的数{a.replace(pos, b.length(), c);//用新的串替换掉指定的串pos += c.length();pos = a.find(b, pos); //从下一个下标pos开始查有没有b字符串,而不是从头开始查}cout << a;return 0;}

1113

#include <iostream>#include <string>using namespace std;int main(){string str;getline(cin, str);int a[101] = { 0 };int num1 = 0;int a_num = 0;int b[101] = { 0 };int num2 = 0;int b_num = 0;int first = 0;//记录是否为第一次出现for (int i = 0; i < str.size(); i++){if (str[i] >= 48 && str[i] <= 57 && first == 0){num1 = i + 1;//记录第一次出现数字的位置for (i; i < str.size(); i++){if (str[i] >= 48 && str[i] <= 57){a[a_num] = str[i] - 48;a_num++;}if (!(str[i] >= 48 && str[i] <= 57)){break;}}first = 1;//第一次已出现}if (str[i] >= 48 && str[i] <= 57 && first == 1)//第不知道多少次出现数字总之不是第一次{num2 = i + 1;for (i; i < str.size(); i++){if (str[i] >= 48 && str[i] <= 57){b[b_num] = str[i] - 48;b_num++;}if (!(str[i] >= 48 && str[i] <= 57)){break;}}first = 2;}if (first == 2)//已经至少出现了两次数字,那么此时可以做一个比较,如果数组a对应的数字比较大,那么将b置空,然后first置1,//重新进行之前的步骤;如果数组b对应的数字比较大,那么将数组a用b覆盖掉就好了,然后b依然置0,first置1{if (a_num > b_num){num2 = 0;b_num = 0;for (int i = 0; i < 101; i++){b[i] = 0;}first = 1;}if (a_num < b_num){num1 = 0;a_num = 0;for (int i = 0; i < 101; i++){a[i] = 0;}for (int i = 0; i < b_num; i++){a[i] = b[i];}num1 = num2;a_num = b_num;num2 = 0;b_num = 0;for (int i = 0; i < 101; i++){b[i] = 0;}first = 1;}if (a_num == b_num){int op = 0;//操作的次数,我们只要操作一次就好了for (int i = 0; i < a_num; i++){if (a[i] > b[i] && op == 0){num2 = 0;b_num = 0;for (int i = 0; i < 101; i++){b[i] = 0;}op = 1;//操作一次,后续不再发生,除非op被重新置0}if (a[i] < b[i] && op == 0){num1 = 0;a_num = 0;for (int i = 0; i < 101; i++){a[i] = 0;}for (int i = 0; i < b_num; i++){a[i] = b[i];}num1 = num2;a_num = b_num;num2 = 0;b_num = 0;for (int i = 0; i < 101; i++){b[i] = 0;}op = 1;}if (a[i] == b[i]){continue;}}}}}cout << num1;return 0;}

1114

作为一个初学者,我认为好好研究一下1083是有一定必要的,起码我个人觉得里面的思想在字符串这一节是比较核心的(当然要是你们觉得不对也可以提出来),这道题在获取各个位数方面又用到了这个思想。

#include <iostream>#include <string>#include <cmath>using namespace std;int main(){string a;getline(cin, a);int result = 0;int adjust = 0;int j = 0;//j不仅可以用于循环,也可用来记录result的位数int q = 0;//用来记录adjust的位数,从而用来确定循环次数int can = 0;//表示是否能够找到这个式子int num = 0;//用来记录切开后的和for (int i = a.size() - 1; i >= 0; i--){if (a[i] != '='){result += (a[i] - 48) * pow(10, j);j++;}else{break;}}for (int i = 0; i < a.size(); i++){if (a[i] != '='){adjust = adjust * 10 + a[i] - 48;q++;}else{break;}}for (int i = 1; i <= q - 1; i++){num = adjust - adjust / (int)pow(10, i) * (int)pow(10, i) + adjust / (int)pow(10, i);//读取各个位并且在不同的地方切开,这个思路在回文数(1083)里也有if (num == result){cout << adjust / (int)pow(10, i) << "+" << adjust - adjust / (int)pow(10, i) * (int)pow(10, i) << "=" << result;can = 1;//找得到break;}}if (can == 0){cout << "Impossible!";//找不到}return 0;}

1115

这题目难度的跨度有点大了..

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num = 0;for (int i = 0; i < a.size() ; i++){num += a[i] - 48;}cout << num;return 0;}

1116

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num = 0;for (int i = 0; i < a.size(); i++){if (a[i] == ','){num = i;break;}}for (int i = num + 1; i < a.size(); i++){cout << a[i];}cout << ",";for (int i = 0; i < num; i++){cout << a[i];}return 0;}

1117

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int work = 0;int num;//当string中有0的时候记录排序后第一个不为0的位置for (int i = 0; i < a.size() - 1; i++){for (int j = 0; j < a.size() - i - 1; j++){if (a[j] > a[j + 1]){char temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}if (a[0] != '0'){for (int i = 0; i < a.size(); i++){cout << a[i];}}else{for (int i = 0; i < a.size(); i++){if (a[i] != '0'&&work==0){char temp = a[0];a[0] = a[i];a[i] = temp;work = 1;//找到第一个非0元素,重新将i置0并从头输出i = 0;}if (work == 1){cout << a[i];}}}return 0;}

1118

#include <iostream>#include <cmath>using namespace std;void judge(int i){int a[7];int g = i * i;int work = 1;if (i * i / 1000000 != 0)//一定要是七位数{for (int j = 0; j < 7; j++){a[j] = (g - g / (int)pow(10, j+1) * (int)pow(10, j+1)) / (int)pow(10, j);//获取各个数位,可以参考1083回文数}for (int i = 0; i < 7; i++){for (int j = i + 1; j < 7; j++){if (a[i] == a[j]){work = 0;}}}if (work == 1){cout << i << endl;}}}int main() {int a, b;cin >> a >> b;for (int i = a; i <= b; i++){judge(i);}return 0;}

1119

#include <iostream>#include <cmath>using namespace std;int main(){int sum = 0;int n;cin >> n;int num = 0;for (int i = 1;; i *= 10){if ((n / i) != 0){num++;}else{break;}}for (int j = 1; j <= num; j++){sum += (n - n / (int)pow(10, j) * (int)pow(10, j)) / (int)pow(10, j-1);}cout << sum;return 0;}

1120

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);for (int i = a.size() - 1; i >= 0; i--){cout << a[i];}return 0;}

1121

参考1083回文数中生成回文数函数,只需要稍作修改即可

#include <iostream>#include <cmath>using namespace std;int produce(int& n){int num = 0;int sum = 0;for (int i = 1; n / i != 0; i *= 10){if (n / i != 0){num++;}}for (int i = 1; i < num; i++){sum += (n - n / (int)pow(10, i) * (int)pow(10, i)) / (int)pow(10, i - 1) * (int)pow(10, num - i);}sum += n / pow(10, num - 1);n = sum;return n;}int main(){int n;cin >> n;cout << produce(n);return 0;}

1122

#include <iostream>#include <string>using namespace std;int main(){string a;int num = 0;getline(cin, a);/*for (int i = 3; i < a.size(); i++){if (a[i] == '+'){num = a[i-1] + a[i + 1] - 48;a[i + 1] = num;}if (a[i] == '-'){num = a[i-1] - a[i + 1];a[i + 1] = num;}if (a[i] == '*'){num = (a[i-1]-48) * (a[i + 1] - 48);a[i + 1] = num;}}*///这是我最开始的思路,但是是错的,原因就在下面,供大家参考一下if (a[1] == '+')//在这里把a[0],a[2]单拎出来,这样可以得到第一个int值,从而方便后面的加减乘 //如果将算出的数重新放回string里面的话一旦num值为两位数那么在string就要用 //两个位置来存放,达不到我们进行计算的目的{num = a[0] + a[2] - 96;}if (a[1] == '-'){num = a[0] - a[2];}if (a[1] == '*'){num = (a[0] - 48) * (a[2] - 48);}for (int i = 3; i < a.size(); i++){if (a[i] == '+'){num = num + a[i + 1] - 48;}if (a[i] == '-'){num = num - a[i + 1] + 48;}if (a[i] == '*'){num = num * (a[i + 1] - 48);}}cout << num;return 0;}

1123

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num = 0;int sum = 0;for (int i = 0; i < a.size(); i++){if (a[i] >= 48 && a[i] <= 57){num = num * 10 + a[i]-48;}if (a[i] == '+')//遇到加号的时候进行结算{sum += num;num = 0;}}sum += num;//因为这样的话最后一个数已经被num记住了但并没有被加入进来,所以在循环结束后再加一回cout << sum;return 0;}

1124

与1123相比这个修复了一点小漏洞,也不算漏洞但是做的确实不是很好。因为在1123中,如果读取1+2+3的话,实际的流程图(用/来划分应该是)1+/2+,最后记录3,然后3+3,显然是非常的反人类的但是恰好AC了我当时就没有继续研究它,而直到1124我发现不能只是简单的改个符号之后我才意识到这个问题,所以对此进行了优化,下面是代码:

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num = 0;int sum = 0;for (int i = 0; i < a.size(); i++){if (a[i] >= 48 && a[i] <= 57){num = num * 10 + a[i]-48;}if (a[i] == '+')//遇到加号的时候进行结算{sum += num;num = 0;//while循环可以将符号后面紧跟着的一个数进行读取并加减while (a[i+1] >= 48 && a[i+1] <= 57){num = num * 10 + a[i+1] - 48;i++;}sum += num;num = 0;}if (a[i] == '-'){sum -= num;num = 0;while (a[i + 1] >= 48 && a[i + 1] <= 57){num = num * 10 + a[i + 1] - 48;i++;}sum -= num;num = 0;}}cout << sum;return 0;}

1125

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);for (int i = 0; i < a.size(); i++)//两个for循环的目的本质就是给不要删去的*加一层标记{if (a[i] == '*'){a[i] = 0;}else{break;}}for (int i = a.size() - 1; i >= 0; i--){if (a[i] == '*'){a[i] = 0;}else{break;}}for (int i = 0; i < a.size(); i++){if (a[i] == 0){cout << '*';}else if (a[i] == '*'){continue;}else{cout << a[i];}}return 0;}

1126

首先我不得不承认这道题我做不出来,在中间夹0比如10014,2500006这种我不知道该怎么去输出,我做的只是那种最为一般的数比如168942这种,只能说能力有限,下面把烂尾的代码发出来,注意这个代码是不正确的!供大家参考一下

#include <iostream>using namespace std;int n_num(int n)//判断位数的函数{int a = 1;for (int i = 10;; i *= 10){if (n / i != 0){a++;}else{break;//如果n/i==0的话说明已经到达最高位了,就可以停下来了}}return a;}void num_one(int n)//一位数{switch (n){case 1:cout << "one";break;case 2:cout << "two";break;case 3:cout << "three";break;case 4:cout << "four";break;case 5:cout << "five";break;case 6:cout << "six";break;case 7:cout << "seven";break;case 8:cout << "eight";break;case 9:cout << "nine";break;}}void num_two_one(int n){switch (n){case 10:cout << "ten";break;case 11:cout << "eleven";break;case 12:cout << "twelve";break;case 13:cout << "thirteen";break;case 14:cout << "fourteen";break;case 15:cout << "fifteen";break;case 16:cout << "sixteen";break;case 17:cout << "seventeen";break;case 18:cout << "eighteen";break;case 19:cout << "nineteen";}}void num_two_other(int n){switch (n / 10){case 2:cout << "twenty";break;case 3:cout << "thirty";break;case 4:cout << "forty";break;case 5:cout << "fifty";break;case 6:cout << "sixty";break;case 7:cout << "seventy";break;case 8:cout << "eighty";break;case 9:cout << "ninety";break;}if (n % 10 != 0){cout << "-";num_one(n % 10);}}void num_three(int n){num_one(n / 100);if (n % 100 == 0){cout << " hundred";}else{cout << " hundred and ";if (n % 100 / 10 == 1){num_two_one(n % 100);}else{num_two_other(n % 100);}}}void num_four_to_six(int n){if (n_num(n / 1000) == 1)//4位数,比如1179{num_one(n / 1000);cout << " thousand ";num_three(n % 1000);}if (n_num(n / 1000) == 2)//5位数,比如11451{if (n / 10000 == 1){num_two_one(n / 1000);cout << " thousand ";num_three(n % 1000);}else{num_two_other(n / 1000);cout << " thousand ";num_three(n % 1000);}}if (n_num(n / 1000) == 3)//6位数,比如114514(好臭的数字){num_three(n / 1000);cout << " thousand ";num_three(n % 1000);}}void num_seven_to_nine(int n){if (n_num(n / 1000000) == 1)//7位数{num_one(n / 1000000);cout << " million ";num_four_to_six(n % 1000000);}if (n_num(n / 1000000) == 2)//8位数{if (n / 10000000 == 1){num_two_one(n / 1000000);cout << " million ";num_four_to_six(n % 1000000);}else{num_two_other(n / 1000000);cout << " million ";num_four_to_six(n % 1000000);}}if (n_num(n / 1000000) == 3)//9位数{num_three(n / 1000000);cout << " million ";num_four_to_six(n % 1000000);}}void num_ten(int n)//10位数{num_one(n / 1000000000);cout << " billion ";num_seven_to_nine(n % 100000000);}int main(){//题目给的范围刚好是int型,不如直接用int就不要用string了int n;cin >> n;if (n_num(n) == 0)//0位数,0比较特别,如果放在n_num函数里面0输出的a是0所以不妨单独讨论{cout << "zero";return 0;}if (n_num(n) == 1)//1位数{num_one(n);}if (n_num(n) == 2)//2位数{if (n / 10 == 1)//2位数中1开头的也很特殊,所以也单拎出来{num_two_one(n);}else{num_two_other(n);}}if (n_num(n) == 3){num_three(n);}if (n_num(n) >= 4 && n_num(n) <= 6){num_four_to_six(n);}if (n_num(n) >= 7 && n_num(n) <= 9){num_seven_to_nine(n);}if (n_num(n) == 10){num_ten(n);}return 0;}

1127

采用了别人的思路,下面放上链接

这里面写的东西有一些我还不会的,等我慢慢学

#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;//定义比较规则bool compare(const int& a, const int& b){return atoi((to_string(a) + to_string(b)).data()) > atoi((to_string(b) + to_string(a)).data());//从大到小排序,使用字符串拼接}int main(){int n;cin >> n;int* p = new int[n];for (int i = 0; i < n; i++){cin >> p[i];}vector<int> nums(p, p + n);//输入一个整数数组sort(nums.begin(), nums.end(), compare);//使用sort函数排序,自定义规则for (auto x : nums)//从大到小输出,就是拼接成的最大整数cout << x;return 0;}

1128

输入的东西在10位以内不如直接偷鸡用int而不用string

#include <iostream>#include <string>#include <cmath>using namespace std;bool prime(int n)//经典的判断质数函数{int prime = 1;for (int i = 2; i <= sqrt(n); i++){if (n % i == 0){prime = 0;break;}}if (prime == 1){return true;}else{return false;}}int main(){int n;int a, b;cin >> n;int num = 0;int min = 1410065407;//int类型的最大数for (int i = 0;; i++){if (n / (int)pow(10, i) == 0)//还是要注意隐式转换的问题{break;}else{a = n / (int)pow(10, i);b = n % (int)pow(10, i);if (prime(a+b) == true && min > a+b)//同时满足质数和更小{min = a + b;}}}if (min < 1410065407)//当min还等于1410065407说明没有这样的质数{cout << min;}else{cout << -1;}return 0;}

1129

误打误撞,发现没有加long long也可以

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num1 = 0;int num2 = 0;int work = 0;for (int i = 0; i < a.size(); i++){if (a[i] >= 48 && a[i] <= 57&&work==0){num1 = num1 * 10 + a[i] - 48;}if (a[i] >= 48 && a[i] <= 57 && work == 1){num2 = num2 * 10 + a[i] - 48;}if (a[i] == '*'){work = 1;}}cout << num1 * num2;return 0;}

1130

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);int num1 = 0;int num2 = 0;int work = 0;for (int i = 0; i < a.size(); i++){if (a[i] >= 48 && a[i] <= 57&&work==0){num1 = num1 * 10 + a[i] - 48;}if (a[i] >= 48 && a[i] <= 57 && work == 1){num2 = num2 * 10 + a[i] - 48;}if (a[i] == '+'){work = 1;}}cout << num1+num2;return 0;}

1131

思路和1105完全一致

#include <iostream>#include <string>using namespace std;int main(){string a;char b;getline(cin, a);b = getchar();for (int i = 0; i < a.size(); i++){if (a[i] == b){a[i] = 0;}}string c;for (int i = 0; i < a.size(); i++){if (a[i] != 0){c += a[i];}}for (int i = 0; i < c.size(); i++){cout << c[i];}return 0;}

1132

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);string b;int work = 0;//用来记录是否有非数字字符for (int i = 0; i < a.size(); i++){if (a[i] >= 48 && a[i] <= 57){b += a[i];//数字照之前录入work = 0;}else{if (work == 0){work = 1;//有非数字字符,并且往第二个字符串里添加*b += '*';}}}cout << b;return 0;}

1133

#include <iostream>#include <string>using namespace std;int main(){string a;getline(cin, a);for (int i = 0; i < a.size(); i++){if (a[i] >= 65 && a[i] <= 90){cout << (char)(155 - a[i]);//155=(90+65)/2,找中间就好了}else if (a[i] >= 97 && a[i] <= 122){cout << (char)(219 - a[i]);}else{cout << a[i];}}return 0;}

1134

转载了别人写的

#include<iostream>using namespace std;int main(){ string s; getline(cin,s); int len=s.size(); if(len%2!=0) { cout<<len;} else {while(1) {for(int i=0,j=len-1;i<j;i++,j--) { if(s[i]!=s[j]) { cout<<len; return 0; } } len/=2;}} return 0;}————————————————版权声明:本文为CSDN博主「无名程序员就是我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_66786097/article/details/122882312

1135

高端的程序往往采用最朴素的写法

#include <iostream>#include <string>using namespace std;int main(){int a[46] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199 };int n;cin >> n;for (int i = 1; i <= n; i++){if (i % 2 == 0){for (int j = 0; j < 46; j++){for (int k = 0; k < 46; k++){if (a[j] + a[k] == i&&a[j]<=a[k]){cout << i << "=" << a[j] << "+" << a[k] << endl;}}}}}return 0;}

1136

是1150的升级版,但只升了一点点

#include <iostream>#include <cmath>using namespace std;int main(){int n,m;cin >> m >> n;int num2 = 0;for (int i = m; i <= n; i++){int num = 0;for (int j = 1; j <= i / 2 + 1; j++){if (i % j == 0){num += j;}}if (num == i){cout << i << " ";}}return 0;}

1137

今天状态不是很好,抱歉

#include <iostream>bool isnum(long long n)//合数为0,质数为1{long long j;for (j = 2; j * j <= n; j++){if (n % j == 0){return false;}}return true;}using namespace std;int main(){for (int i = 1000; i <= 3000; i++){int d = i % 1000 % 100 % 10;//isnum函数没写好,会把1判断成质数if (isnum(i) == 1 && isnum(i % 10) == 1 && isnum(i % 100) == 1 && isnum(i % 1000) == 1 && d != 1){cout << i << endl;}}return 0;}

1138

#include <iostream>#include <string>#include <cmath>using namespace std;bool prime(int& n)//经典的判断质数函数{int prime = 1;for (int i = 2; i <= sqrt(n); i++){if (n % i == 0){prime = 0;break;}}if (prime == 1){return true;}else{return false;}}int main(){string a;string b;getline(cin, a);int n = 0;for (int i = 0; i < a.size()-2; i++){int n = (a[i] - 48) * 10 + a[i + 1] - 48;if (prime(n) == true){n = n % 10 * 10 + (n / 10);if (prime(n) == true){b += a[i];b += a[i + 1];b += ',';}}}for (int i = 0; i < b.size() - 1; i++){cout << b[i];}return 0;}

1139

#include <iostream>#include <cmath>using namespace std;int sushu(int x){for (int i = 2; i <= sqrt(x); i++){if (x % i == 0)return 0;}return 1;}int main(){int n;cin >> n;for (int i = 2; i <= n; i++){if (i + 2 <= n){if (sushu(i) == 1 && sushu(i + 2) == 1){cout << i << " " << i + 2 << endl;}}}return 0;}

1140

#include <iostream>using namespace std;int main(){int n;cin >> n;for (int j = 2; j <= n; j++){int num1 = 0;int num2 = 0;for (int i = 2; i <= j / 2; i++){if (j % i == 0){num1 += i;}}for (int i = 2; i <= num1 / 2; i++){if (num1 % i == 0){num2 += i;}}if (num2 == j && num1 != num2 && num1 <= n)//注意两个输出的数都不能比n大且不能相等{cout << j << " " << num1 << endl;}}return 0;}

1141

#include <iostream>using namespace std;void BinaryRecursion(int n){int a;a = n % 2;n = n>>1;if (n == 0);else{BinaryRecursion(n);}cout << a;}//这段是整数转二进制数的,也可以看看,在题目中用不上int main(){int n;cin >> n;int numA = 0;int numB = 0;for (int i = 1; i <= n; i++){int num1 = 0;int num0 = 0;int q = i;while (q != 0){if (q % 2 == 1){num1++;}else{num0++;}q /= 2;}if (num1 > num0){numA++;}else{numB++;}}cout << numA << " " << numB;return 0;}

1142

在判断回文数函数的基础上再加上一个判断质数的函数就可以了

#include <iostream>#include <cmath>using namespace std;bool palindrome(int& n){int num = 0;int sum = 0;for (int i = 1; n / i != 0; i *= 10){if (n / i != 0){num++;}}for (int i = 1; i < num; i++){sum += (n - n / (int)pow(10, i) * (int)pow(10, i)) / (int)pow(10, i - 1) * (int)pow(10, num - i);}sum += n / pow(10, num - 1);if (n == sum){return true;}else{return false;}}bool prime(int& n){int prime = 1;for (int i = 2; i <= sqrt(n); i++){if (n % i == 0){prime = 0;break;}}if (prime == 1){return true;}else{return false;}}int main(){for (int i = 10; i <= 1000; i++){if (palindrome(i) == true && prime(i) == true){cout << i << endl;}}return 0;}

1143

#include <iostream>#include <string>#include <cmath>bool isnum(long long n)//合数为0,质数为1{long long j;for (j = 2; j * j <= n; j++){if (n % j == 0){return false;}}return true;}using namespace std;int main(){for (int i = 100; i <= 999; i++){if (isnum(i) == 0 && isnum(i / 10) == 0 && isnum(i / 100) == 0){cout << i << endl;}}return 0;}

1144

直接把100内所有质数列出来了

#include <iostream>#include <cmath>using namespace std;bool prime(int n){int prime = 1;for (int i = 2; i <= sqrt(n); i++){if (n % i == 0){prime = 0;break;}}if (prime == 1){return true;}else{return false;}}int main(){int p[25] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 };for (int i = 0; i < 25; i++){for (int j = i + 1; j < 25; j++){int temp = (p[i] + p[j]) / 2;if (prime(temp) == true && (p[j] - temp == temp - p[i])){cout << p[i] << " " << temp << " " << p[j] << endl;}}}return 0;}

1145

简单的递归

#include <iostream>using namespace std;int serie(int n){if (n == 1 || n == 2){return n;}else{return n - 1 + serie(n - 1);}}int main(){int n;cin >> n;int sum = 0;for (int i = 1; i <= n; i++){sum += serie(i);}cout << sum;return 0;}

1146

上一道题稍作修改即可

#include <iostream>using namespace std;int serie(int n){if (n == 1 || n == 2){return n;}else{return n - 1 + serie(n - 1);}}int main(){int sum = 0;for (int i = 1;; i++){sum += serie(i);if (sum >= 5000){cout << sum;break;}}return 0;}

1147

也是递归

#include <iostream>#include <iomanip>using namespace std;double fibonacci(int n){if (n == 0 || n == 1){return n;}else{return fibonacci(n - 1) + fibonacci(n - 2);}}int main(){int n;cin >> n;double sum = 0;for (int i = 1; i <= n; i++){sum += fibonacci(i) / fibonacci(i + 1);}cout << fixed << setprecision(3) << sum;return 0;}

1148

#include <iostream>using namespace std;int serie(int n){if (n == 1){return n;}else{return n + serie(n - 1);}}int main(){int n;cin >> n;int sum = 0;for (int i = 1; i <= n; i++){sum += serie(i);}cout << sum;return 0;}

1149

1083回文数,真是一招鲜吃遍天...都已经拿来用好几回了

#include <iostream>#include <cmath>using namespace std;bool judge(int n)//判断回文数函数{int num = 0;//记录位数int sum = 0;for (int i = 1; n / i != 0; i *= 10)//判断位数{if (n / i != 0){num++;}}for (int i = 1; i < num; i++){sum += (n - n / (int)pow(10, i) * (int)pow(10, i)) / (int)pow(10, i - 1) * (int)pow(10, num - i);}sum += n / pow(10, num - 1);if (sum == n){return true;}else{return false;}}int main(){int n;cin >> n;int num = 0;for (int i = 1; i <= n; i++){if (judge(i) == true){num++;}}cout << num;return 0;}

1150

1不是完全数,所以int i直接从2开始,不然会产生误判。

#include <iostream>#include <cmath>using namespace std;int main(){int n;cin >> n;int num2 = 0;for (int i = 2; i <= n; i++){int num = 0;for (int j = 1; j <= i / 2 + 1; j++){if (i % j == 0){num += j;}}if (num == i){num2++;}}cout << num2;return 0;}
东方博宜oj答案1101-1150_c++_always-like-a-star-开放原子开发者工作坊 (2024)
Top Articles
Latest Posts
Article information

Author: Carlyn Walter

Last Updated:

Views: 6410

Rating: 5 / 5 (70 voted)

Reviews: 85% of readers found this page helpful

Author information

Name: Carlyn Walter

Birthday: 1996-01-03

Address: Suite 452 40815 Denyse Extensions, Sengermouth, OR 42374

Phone: +8501809515404

Job: Manufacturing Technician

Hobby: Table tennis, Archery, Vacation, Metal detecting, Yo-yoing, Crocheting, Creative writing

Introduction: My name is Carlyn Walter, I am a lively, glamorous, healthy, clean, powerful, calm, combative person who loves writing and wants to share my knowledge and understanding with you.