2019西电机试算法题

Problem 1

题目描述:任意给定n个整数,求这n个整数序列的和、最小值、最大值。

输入描述:输入一个整数n,代表接下来输入整数的个数,0<n<=100,接着输入n个整数,整数用int表示即可。

输出描述:输出整数序列的和、最小值、最大值。用空格隔开,占一行。

代码:如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<cstdio>
#include<climits>

using namespace std;
int main(){
int n;
scanf("%d",&n);
int sum=0,mx=INT_MIN,mn=INT_MAX;
int num;
for(int i=0;i<n;++i){
scanf("%d",&num);
sum+=num;
mx=max(mx,num);
mn=min(mn,num);
}
printf("%d %d %d\n",sum,mn,mx);
}

Problem 2

题目描述:

输入描述:输入一个二进制整数n,其长度>0且不大于10。

输出描述:输出转换后的十进制数,占一行。

代码:如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
#include<string>

using namespace std;
int main(){
string str;
cin>>str;
int num;
for(int i=0;i<str.size();++i){
num=num*2+str[i]-'0';
}
cout<<num<<endl;
return 0;
}

Problem 3

题目描述:打印n阶实心菱形。

输入描述:输入一个整数n,0<n<=10

输出描述:输出n阶实心菱形,占2*n-1行。

代码:如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<cstdio>

using namespace std;
int main(){
// 规律 上下对称。 n-1 1 n-1
// 1 3 5 3 1
//对应行号:1 2 3 4 5

for(int i=1;i<n-1;++i){
for(int j=1;j<=i;++j){
cout<<"*";
}
cout<<endl;
}
for(int j=1;j<=2*n-1;++j){
cout<<"*";
}
cout<<endl;
for(int i=1;i<)
}

Problem 4

题目描述:将大整数用字符串存储起来,并将其每一位拆分开,按照字符的顺序存入int数组中,数组的下标从大数字的低位到高位递增,数组的值即大整数每一位的值。其加减法,也是按位进行运算,注意进位和借位的处理即可。

输入描述:

输出描述:

代码:如下:

1
2
3
4
5
6
7
#include<iostream>
#include<string>

using namespace std;
int main(){

}

研梦答案:

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
struct bign{
int d[1000];
int len;
bign(){
// 构造函数方便每次定义一个大整数时,都进行了初始化
memset(d,0,sizeof(d));
len=0;
}
}; // ; 不能少

// 将字符串转化为大整数
bign change(char str[]){
bign a;
a.len=strlen(str);
int count=0;
// 去除大数字高位上的0
for(int i=0;i<a.len;++i){
if(str[i]=='0'){
++count;
}
else{
break;
}
}

for(int i=0;i<a.len-count;++i){ // 低位存于低索引处
a.d[i]=str[a.len-1-i]-'0';
}
a.len-=count;
return a;
}

// 比较两数的大小
int compare(bign a,bign b){
if(a.len>b.len){
return 1;
}else if(a.len==b.len){
for(int i=a.len-1;i>=0;--i){
if(a.d[i]>b.d[i]){
return 1;
}else if(a.d[i]<b.d[i]){
return -1;
}
}
return 0;
}else{
return -1;
}
}

// 高精度+
bign add(bign a,bign b){
bign c;
int carry = 0; // 进位
for(int i=0;i<a.len||i<b.len;++i){ // 讲究,一开始置0了
// 从最低位开始加起
int temp=a.d[i]+b.d[i]+carry;
c.d[c.len++]=temp%10;
carry=temp/10; // 新的进位
}
if(carry!=0){
c.d[c.len++]=carry;
}
return c;
}

// 高精度-
bign sub(bign a,bign b){
bign c;
for(int i=0;i<a.len||i<b.len;++i){
if(a.d[i]<b.d[i]){
// 不够减,借位
a.d[i+1]--; // 高位借位-1
a.d[i]+=10; // 低位+10
}
c.d[c.len++]=a.d[i]-b.d[i];
}
// 去除差中的高位0
while(c.len-1>=1&&c.d[c.len-1]==0){
c.len--;
}
return c;
}

// 打印大整数
void print(bign a){
for(int i=a.len-1;i>=0;--i){
cout<<a.d[i];
}
cout<<endl;
}

int main(){
char str1[1000],str2[1000];
while(cin>>str1>>str2){
bign a=change(str1);
bign b=change(str2);
if(compare(a,b)<0){
cout<<"-";
print(sub(b,a)); // https://blog.csdn.net/qq_50635297/article/details/129214749
}else{
print(sub(b,a));
}
}
return 0;
}