西安电子科技大学上机题(四)

题目: 对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31),计算并输出该整数的最大因子(如果是素数,则其最大因子为自身)。

输入格式:

1
有多组数据,输入数据的第一行为一个正整数,表示字符序列的数目,每组数据为一行字符序列。

输出格式:

1
对每个字符序列,取出所得整数的最大因子,若字符序列中没有数字或者找出的整数为0,则输出0,每个整数占一行输出。

输入样例:

1
2
3
2
qwq24
3dnh5

输出样例:

1
2
12
7

思路:
主要在于分三步完成

  • 首先获取用户输入,并用变量保存好
  • 拆分出用户输入的字符串中的无符号数字保存在数组中
  • 通过类似于求素数的方式求函数的因子(不同点在于不要从 sqrt(num) 开始,而应该从 num / 2 开始,因为 2 是最小的素数,而最大的因子除本身外应该是除 2 得到的数),从大到小遍历

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <bits/stdc++.h>
using namespace std;

void getNumArray(string strs[], int nums[], int n) {
for(int i = 0; i<n; i++) {
int j = 0;
int num = 0;
while(strs[i][j] != '\0'){
if(strs[i][j] >= '0' && strs[i][j] <= '9'){
num = num * 10 + strs[i][j] - '0';
}
j++;
}
nums[i] = num;
}
}

void getMaxYinZi(int nums[], int maxYinZiArray[], int n) {
for(int i = 0; i<n; i++) {
int j;
for(j = nums[i] / 2; j > 1; j--) {
if(nums[i] % j == 0){
maxYinZiArray[i] = j;
break;
}
}
if(j == 1)
maxYinZiArray[i] = nums[i];
}
}
int main(void) {
int n;
cin >> n;
string strs[n];
int nums[n];
int maxYinZiArray[n];
for(int i = 0; i<n; i++) {
cin >> strs[i];
}
getNumArray(strs, nums, n);
getMaxYinZi(nums, maxYinZiArray, n);
for(int i = 0; i<n; i++) {
cout << maxYinZiArray[i] << endl;
}
return 0;
}