題目描述
對於給定的字符序列,從左至右將所有的數字字符取出拼接成一個無符號整數(字符序列長度小於100,拼接出的整數小於2^31,),計算並輸出該整數的最大素因子(如果是素數,則其最大因子為自身)
輸入描述:
有多組數據,輸入數據的第一行為一個正整數,表示字符序列的數目,每組數據為一行字符序列。
輸出描述:
對每個字符序列,取出所得整數的最大素因子,若字符序列中沒有數字或者找出的整數為0,則輸出0,每個整數占一行輸出。
示例1
輸出
復制13 857 0
分析:本題目有兩個要點,一是如何將字符串中的數字提取出來並計算成對應的整數
而是求出這個數的最大質因子
需要注意的是:1.質數的最大質因子就是其本身,一個合數總可以分解為幾個質因子之積,所以並無需驗證是否為質數
2.一個合數如果有超過根號n的質因子,有且僅有一個,
/* 對於本題而言,下邊使用了快速分解定理: 1、即對於一個合數總存在有質數因子,所以我們在分解合數的時候不需要判斷被整除的因子是否為質數。 2、理解是一個難點,對於一個合數,我們將小於等於這個合數平方根的質因子整除完之后,若 余下的書大於1,說明本合數存在並且僅存在一個大於這個合數的平方根的質因子*/ #include<iostream> #include<vector> #include<string> #include<math.h> using namespace std; const int maxn = 100000; int max_yinzi(int n) { int max =0; for(int i=2;i<=sqrt(1.0*n);i++)//從2到根號n求其質因數 { while(n%i==0) //因為一個質因數可能會乘多次,所以應該用while,而不是if { max = i; //讓max指向當前最大值 n /= i; //除以質因數 } if(n==1) break; } if(n!=1) //如果n不等於1,說明存在一個大於根號n的質因數,有且僅有一個,即等於當前的n max = n; return max; } int main() { int n; vector<string> str; char ch[101]; string temp; int sum; double count; while(cin>>n) { str.clear();//清空 getchar(); //用在gets()之前 for(int i=0;i<n;i++) { gets(ch); //考慮到輸入可能有空格 str.push_back(ch); } for(int i=0;i<n;i++)//對str中每一個字符串進行分析 { sum = 0; count = 0; temp = str[i]; for(int j = temp.length()-1;j>=0;j--) //從后往前, { if(temp[j]>='0'&&temp[j]<='9') { sum += (temp[j] -'0')*pow(10.0,count); count++; } } cout<<max_yinzi(sum)<<endl; } } return 0; }
運行時間:54ms
占用內存:492k
