思想
用试除法求出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;
}
思路比较简单,就是数字全部提取出来加在一起。
需要注意的是负号-,有可能作为分隔符使用。
如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;
}