传送门
东方博宜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
(这是一张图片)
不知道之前插入链接是怎么搞的可以搞成这种形式,但是现在又不会了,有没有人可以教教我呜呜呜。
写在前面
后面的题目开始越来越难了,水平所限我也不敢说我每道都能做的出来,只能说尽量咯,加油
题目不是按顺序做的,也不是一天搞定的,所以可能有些时候状态不太好写出来的代码比较脑溢血还请多包涵。
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;
}