题目描述
对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31,),计算并输出该整数的最大素因子(如果是素数,则其最大因子为自身)。
输入描述:
有多组数据,输入数据的第一行为一个正整数,表示字符序列的数目,每组数据为一行字符序列。
输出描述:
对每个字符序列,取出所得整数的最大素因子,若字符序列中没有数字或者找出的整数为0,则输出0,每个整数占一行输出。
示例
输入
3
sdf0ejg3.f?9f
?4afd0s&2d79*(g
abcde
输出
13
857
0
思路
-
定义一个字符数组,一个一个判断。
-
输入字符串,判断是否有数字字符,若有,将其转化为数字,并用n保存。
-
求最大因子:i从1到n-1循环,n对i取模,若能除尽,用t存放因子。循环到n-1,t存放的是最大的一个因子。若t=1,表示n为素数,则最大的因子是它本身。输出最大因子数。
具体实现
#include<bits/stdc++.h>
using namespace std;
int main(){
char str[100];
int i,n,f,t;
cin>>f; //输入字符序列的个数
while(f--){//循环输入
memset(str,0,sizeof(str)); //将str用'0'表示
cin>>str;
n=0; //存放拼接的数字
for(int i=0; i<100; i++){
if(str[i]>='0' && str[i]<='9')
n= n*10 + str[i] - '0'; //拼接为整数
}
if(n==0) cout<<0<<endl;
else{ //求最大因子
for(int i=1; i<n; i++){
if(n%i==0)
t=i;//存放因子
}
if(t==1) //t为素数
t=n; //最大的素因子就是本身
cout<<t<<endl;
}
}
return 0;
}
小结
memset()函数在程序中一般是用来进行数组初始化的,对申请的内存进行初始化,特别是比较大的数组或者是结构体,在定义的时候都应该进行初始化,因为不能保证申请的内存区是干净的,不进行memset(),在打印的时候可能会出现乱码