东方博宜oj答案1101-1150

传送门

东方博宜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

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

https://blog.csdn.net/qq_28584889/article/details/88382070?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167728565016800184144579%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167728565016800184144579&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-88382070-null-null.142^v73^insert_down4,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%E5%A4%9A%E4%B8%AA%E6%95%B4%E6%95%B0%E6%8B%BC%E6%8E%A5&spm=1018.2226.3001.4187

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

#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;
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

always-like-a-star

感谢支持,一定继续努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值