试卷总分:100分
选择题 15题 30分
阅读程序 17题 40分
完善程序 10题 30分
union Data{ int num; float value; char symbol; }; union Data data;
struct Node { int data; Node* next; };
01 #include<iostream> 02 #include<cmath> 03 using namespace std; 04 05 double f(double a,double b,double c){ 06 double s=(a+b+c)/2; 07 return sqrt(s*(s-a)*(s-b)*(s-c)); 08 } 09 10 int main(){ 11 cout.flags(ios::fixed); 12 cout.precision(4); 13 14 int a,b,c; 15 cin>>a>>b>>c; 16 cout<<f(a,b,c)<<endl; 17 return 0; 18 }
假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题:
当输入为“2 2 2”时,输出为“1.7321” ()
01 #include<iostream> 02 #include<vector> 03 #include<algorithm> 04 using namespace std; 05 06 int f(string x,string y){ 07 int m=x.size(); 08 int n=y.size(); 09 vector<vector<int>>v(m+1,vector<int>(n+1,0)); 10 for(int i=1;i<=m;i++){ 11 for(int j=1;j<=n;j++){ 12 if(x[i-1]==y[j-1]){ 13 v[i][j]=v[i-1][j-1]+1; 14 }else{ 15 v[i][j]=max(v[i-1][j],v[i][j-1]); 16 } 17 } 18 } 19 return v[m][n]; 20 } 21 22 bool g(string x,string y){ 23 if(x.size() != y.size()){ 24 return false; 25 } 26 return f(x+x,y)==y.size(); 27 } 28 29 int main(){ 30 string x,y; 31 cin>>x>>y; 32 cout<<g(x,y)<<endl; 33 return 0; 34 }
f 函数的返回值小于等于 min{n,m}。()
01 #include <iostream> 02 #include <cmath> 03 using namespace std; 04 05 int solve1(int n){ 06 return n*n; 07 } 08 09 int solve2(int n){ 10 int sum=0; 11 for(int i=1;i<=sqrt(n);i++){ 12 if(n%i==0){ 13 if(n/i==i){ 14 sum+=i*i; 15 }else{ 16 sum+=i*i+(n/i)*(n/i); 17 } 18 } 19 } 20 return sum; 21 } 22 23 int main(){ 24 int n; 25 cin>>n; 26 cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl; 27 return 0; 28 }
如果输入的n为正整数, solve2函数的作用是计算n所有的因子的平方和()
(寻找被移除的元素)问题:原有长度为n+1、公差为1的等差升序数列;将数列输入到程序的数组时移除了一个元素,导致长度为n的升序数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。试补全程序。
#include <iostream> #include <vector> using namespace std; int find_missing(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left < right){ int mid = left + (right - left) / 2; if (nums[mid] == mid + ①) { ②; } else { ③; } } return ④; } int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) cin >> nums[i]; int missing_number = find_missing(nums); if (missing_number == ⑤) { cout << "Sequence is consecutive" << endl; }else{ cout << "Missing number is " << missing_number << endl; } return 0; }
①处应填()
(编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。
#include <iostream> #include <string> #include <vector> using namespace std; int min(int x, int y, int z) { return min(min(x, y), z); } int edit_dist_dp(string str1, string str2) { int m = str1.length(); int n = str2.length(); vector<vector<int>> dp(m + 1, vector<int>(n + 1)); for (int i = 0; i <= m; i++) { for (int j = 0; j <= n; j++) { if (i == 0) dp[i][j] = ①; else if (j == 0) dp[i][j] = ②; else if (③) dp[i][j] = ④; else dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤); } } return dp[m][n]; } int main() { string str1, str2; cin >> str1 >> str2; cout << "Mininum number of operation:" << edit_dist_dp(str1, str2) << endl; return 0; }