西安电子科技大学上机题(四)
题目: 对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31),计算并输出该整数的最大因子(如果是素数,则其最大因子为自身)。
输入格式:
1
| 有多组数据,输入数据的第一行为一个正整数,表示字符序列的数目,每组数据为一行字符序列。
|
输出格式:
1
| 对每个字符序列,取出所得整数的最大因子,若字符序列中没有数字或者找出的整数为0,则输出0,每个整数占一行输出。
|
输入样例:
输出样例:
思路:
主要在于分三步完成
- 首先获取用户输入,并用变量保存好
- 拆分出用户输入的字符串中的无符号数字保存在数组中
- 通过类似于求素数的方式求函数的因子(不同点在于不要从 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; }
|