题目描述
对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31,),计算并输出该整数的最大素因子(如果是素数,则其最大因子为自身)
输入描述:
有多组数据,输入数据的第一行为一个正整数,表示字符序列的数目,每组数据为一行字符序列。
输出描述:
对每个字符序列,取出所得整数的最大素因子,若字符序列中没有数字或者找出的整数为0,则输出0,每个整数占一行输出。
示例1
输入
3
sdf0ejg3.f?9f
?4afd0s&2d79*(g
abcde
输出
13
857
0
这道题看起来感觉很简单,问题就是在这么大的数INT_MAX如何判断它是否是素数,使用传统的打表方法没办法解决,内存溢出,是哟个暴力求解overtime,随便google一下发现找的都是最大因子,并没有判断是否是素数这一个环节。
有人提到了任何一个证书都可以分解为素数的乘积,了解!
如果以前写过类似的话应该很好懂,在check函数里,如果一个数n在检查他是否是素数的时候其实只要检查到sqrt(n)即可,因为不可能两个因子都大于sqrt(n);也就是说在我这么while循环之后剩下的数肯定是素数,因为不是素数的话早就被除掉了
#include <stdio.h>
#include <string.h>
#include <string>
#include <math.h>
using namespace std;
int lwqCheck(int n) {
for(int i = 2;i*i<=n;i++){
while(n%i==0)
n/=i;
}
return n;
}
int main() {
int n, num;
scanf("%d", &n);
char str[100];
for (int i = 0; i < n; i++) {
num = 0;
scanf("%s", str);
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (isdigit(str[i])) {
num *= 10;
num += str[i] - '0';
}
}
if (num == 0)
printf("0\n");
else {
printf("%d\n",lwqCheck(num));
}
}
return 0;
}