2024年第二届全国大学生信息技术认证挑战赛 题解

69 阅读2分钟

image.png

思想

用试除法求出n的所有质因子

#include<bits/stdc++.h>
using namespace std;

void solve()
{
	int n, a; cin >> n; a = n;
	map<int, int> f;
	for (int i = 2; i * i <= n; i++)
	{
		if (a % i == 0)  //a%i=0说明i是a的约数
		{
			int cnt = 0;
			while (a % i == 0)  //一个while循环,用于将a中所有i的因子除尽。
			{
				a /= i;        //把i除尽
				cnt++;         //统计一下约数的个数,实际上就是约数的指数
			}
			f[i] = cnt;        //将质因数i及其指数cnt存储到映射表f中。
		}
	}
	if (a > 1)f[a]++;  //如果a大于1,那么a就是那个大于根号n的约数
	auto it = f.rbegin();
	for (auto i : f)
	{
		if (i.second == 1)  //如果约数的指数是1,直接输出第一个约数即可
			cout << i.first << " ";
		else  //否则即要输出约数又要输出约数的指数 
			cout << i.first << "^" << i.second << " ";
		if (i != *it)cout << "* ";   //如果当前元素不是映射表中的最后一个元素,则输出乘号*作为乘积的分隔符。
	}
}


int main()
{
	int t = 1;
	while (t--)
	{
		solve();
	}
	return 0;
}

image.png

image.png

image.png

思路比较简单,就是数字全部提取出来加在一起。

需要注意的是负号-,有可能作为分隔符使用。

如2-3,输出的是2+3=5

而2--3,输出的是2-3=-1

那么作为分割符的条件就很明显了,前面不能是数字。

由于输入没有告知多少行,且中间可能存在空行,所以我们使用getline来读入

#include<bits/stdc++.h>
using namespace std;

void solve()
{
	string s;
	while (getline(cin, s))
	{
		int res = 0, ans = 0;
		bool havnum = false;      //用于标记字符串中是否有数字
		int pos = 1;              //用于标记当前数字的正负,1表示正数,-1表示负数。

		if (s.empty())continue;

		for (int i = 0; i <= s.size()-1; i++)
		{
			//把每一个数组都累加起来
			if (s[i] >= '0' && s[i] <= '9')
			{
				havnum = true;
				res *= 10;
				res += s[i] - '0';
			}
			else if(s[i]=='-'&&s[i+1]>='0'&&s[i+1]<='9'&&!(s[i - 1] >= '0' && s[i - 1] <= '9'))pos = -1;
			else
			{
				ans += res * pos;
				pos = true;
				res = 0;
			}
		}
		if (res)ans += res * pos;         //考虑最后结尾是数字,没有累加上的情况。

		if (havnum)cout << ans << endl;  //字符串中至少有一个整数才能输出。
	}
}
int main()
{
	int t = 1;
	while (t--)
	{
		solve();
	}
	return 0;
}