ProblemC
题目描述
对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31,),计算并输出该整数的最大素因子(如果是素数,则其最大因子为自身)
输入描述
有多组数据,输入数据的第一行为一个正整数,表示字符序列的数目,每组数据为一行字符序列。
输出描述
对每个字符序列,取出所得整数的最大素因子,若字符序列中没有数字或者找出的整数为0,则输出0,每个整数占一行输出。
输入
3
sdf0ejg3.f?9f
?4afd0s&2d79*(g
abcde
输出
13
857
0
最大素因子的做法:除掉所有小于其算术平方根的质因子(注意比如100有2个2),比较最后结果和所记录的最大质因子并返回。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
int maxPrime(int num) {
int max=0;
for (int i = 2; i*i <= num; i++) {
while (num%i == 0) {
num /= i;
if(i>max) max =i;
}
}
return num>max?num:max;
}
int string2num(string s) {
int num = 0;
for (int i = 0; i<s.length(); i++) {
if (s[i] >= '0'&&s[i] <= '9') {
num = num * 10 + s[i] - '0';
}
}
return num;
}
int main(void) {
int n;
string input;
scanf("%d", &n);
while (n--) {
cin >> input;
int m = string2num(input);
printf("%d\n", maxPrime(m));
}
return 0;
}
注意点
特别记录:用scanf读入string踩坑
1. 对于 <string>中的string类型,只有cin可以正确处理;
2. 必须使用scanf读取string时,使用scanf("%s", a);,而非scanf("%s", &a[0]);,此时,若要使用cout输出,必须使用cout<<a.c_str();。
最好的方案:还是用cin和cout处理吧。