2018级-C++-第5章课后作业(计科1班、创新班、辅修班)

A#

Problem A: 二进制数右移
print函数功能:把x按二进制位输出,每8位空一格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
void print(long long x){
for(int i=1;i<=32;i++){
cout<<((x>>(32-i))&1);
if(i%8==0)cout<<' ';
}
cout<<endl;
}
int main(){
long long n;
while(cin>>n){
print(n);
print(n>>4);
}
return 0;
}

B#

Problem B: 判断水平线和垂直线
判断是否有相同的x坐标或y坐标即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
struct Point{ int x; int y; }a[105];
int main(){
int n;
while(cin>>n){
int fx=1,fy=1;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
if(i>1&&a[i].x!=a[i-1].x)fx=0;
if(i>1&&a[i].y!=a[i-1].y)fy=0;
}
if(fx||fy)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}

C#

Problem C: 快速交换
请勿使用中间变量完成交换,如检查代码发现中间变量,视为未过。
。。。看到这句话真是。。难道不是不用交换也可以过嘛
这里就说说交换两个变量的原理吧。
一般而言,交换两个变量可以用第三个变量;
但对于整型、浮点型等变量,存在一种利用逆元的交换变量方法。
例如选取±这一对逆元
a=a+b
这时a存放的是a与b的和。
b=a-b
这时b存放的是a与b的和减去b的值(也就是a的值)
a=a-b
这是a存放的是a与b的和减去a的值(也就是b的值)
以此类推,选取*/这一对逆元同样可以。
特殊的是,异或运算的逆元是它本身。
于是就有了看起来很高端的交换方法:
a=a^b
b=a^b
a=a^b
写在一行里就是
a^=b^=a^=b

交换做法#

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
#include <iostream>
using namespace std;
int main(){
//freopen("input.txt","r",stdin);
int n,x[105],y[105];
while(cin>>n){
for(int i=1;i<=n;i++){
cin>>x[i];
}
for(int i=1;i<=n;i++){
cin>>y[i];
}
for(int i=1;i<=n;i++){
x[i]^=y[i]^=x[i]^=y[i];
}
for(int i=1;i<=n;i++){
cout<<x[i]<<' ';
}
cout<<endl;
for(int i=1;i<=n;i++){
cout<<y[i]<<' ';
}
cout<<endl;
int a,b;
cin>>a>>b;
if(a==1)cout<<x[b]<<' '<<endl;
else cout<<y[b]<<' '<<endl;
}
return 0;
}

不交换做法#

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
/*exchange a and b
1: a^=b^=a^=b;
2.t=a;a=b;b=t;
3.a=a+b,b=a-b,a=a-b;
but why not no exchange!
*/
#include <iostream>
using namespace std;
int main(){
//freopen("input.txt","r",stdin);
int n,x[105],y[105];
while(cin>>n){
for(int i=1;i<=n;i++){
cin>>x[i];
}
for(int i=1;i<=n;i++){
cin>>y[i];
}
for(int i=1;i<=n;i++){
cout<<y[i]<<' ';
}
cout<<endl;
for(int i=1;i<=n;i++){
cout<<x[i]<<' ';
}
cout<<endl;
int a,b;
cin>>a>>b;
if(a==1)cout<<y[b]<<' '<<endl;
else cout<<x[b]<<' '<<endl;
}
return 0;
}

D#

Problem D: 找出最高分
注意最后一个输出数据之后没有空格
这里采用了先输出第一个,后面的数据在前面加一个空格的方法。

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
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct student{
string name;
int score;
};
int main(){
//freopen("input.txt","r",stdin);
int n;
while(cin>>n){
struct student s[105];
int maxs=0;
for(int i=1;i<=n;i++){
cin>>s[i].name>>s[i].score;
if(s[i].score>maxs)maxs=s[i].score;
}
int i;
for(i=1;i<=n;i++){
if(s[i].score==maxs){
cout<<s[i].name<<'_'<<s[i].score;
break;
}
}
for(i++;i<=n;i++){
if(s[i].score==maxs){
cout<<' '<<s[i].name<<'_'<<s[i].score;
}
}
cout<<endl;
}
}

E#

Problem E: 头插法建立单链表
请用指针,数组AC视为未通过。
链表好恶心啊。为什么有人会觉得充满指针的代码很优美???
话说不用数组用string类行吗?

指针写法#

末尾两个getchar,第一个是读入0,第二个是读入换行符。

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
#include <iostream>
#include <cstdio>
using namespace std;
struct node{
char data;
node *next;
};
int main(){
//freopen("input.txt","r",stdin);
char ch=getchar();
while(ch!=EOF){
node *head,*p;
head=NULL;
while(ch!='0'){
p=new node;
p->next=NULL;
p->data=ch;
if(head==NULL)head=p;
else{
p->next=head;
head=p;
}
ch=getchar();
}
while(head){
//printf("head->data=%d\n",head->data);
cout<<head->data<<' ';
head=head->next;
//if(head->data<=0)break;
}
cout<<endl;
ch=getchar();
//printf("1:ch=%d\n",ch);
ch=getchar();
//printf("2:ch=%d\n",ch);
}
return 0;
}

string写法#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
struct keyword{};
using namespace std;
int main(){
string s;
while(getline(cin,s)){
int len=s.length();
for(int i=len-2;i>=0;i--){
cout<<s[i]<<' ';
}
cout<<endl;
}
return 0;
}

F#

Problem F: 统计相同数据的出现次数
计算并输出链表数据相同值的结点及个数

链表写法#

first变量用于控制第一个数据之前不用输出空格。包含链表的插入、删除、遍历操作。
一般而言,单链表由三个指针控制。head指向链表头、s指向当前节点、p指向前一个节点。

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
#include <iostream>
using namespace std;
struct node{
int val;
node *next;
};
int main(){
int n;
while(cin>>n){
node *head,*p,*s;
head=new node;
cin>>head->val;
p=head;
while(--n){
s=new node;
p->next=s;
cin>>s->val;
s->next=NULL;
p=s;
}
int first=0;
while(head){
//cout<<"test:"<<head->val<<endl;
int count=1;
p=head;
s=head->next;
while(s){
if(s->val==head->val){
count++;
p->next=s->next;
}else{
p=s;
}
s=s->next;
}
if(count>1){
if(first==1)cout<<' ';
if(first==0)first=1;
cout<<head->val<<'_'<<count;
}
head=head->next;
}
cout<<endl;
}
return 0;
}

数组桶排序#

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
#include <iostream>
using namespace std;
struct keyword{};
int main(){
//freopen("input.txt","r",stdin);
int n;
while(cin>>n){
int a[105],c[1005]={0};
for(int i=1;i<=n;i++){
cin>>a[i];
c[a[i]]++;
}
for(int i=1;i<=n;i++){
if(c[a[i]]>1){
cout<<a[i]<<'_'<<c[a[i]];
c[a[i]]=0;
break;
}
}
for(int i=1;i<=n;i++){
if(c[a[i]]>1){
cout<<' '<<a[i]<<'_'<<c[a[i]];
c[a[i]]=0;
}
}
cout<<endl;
}
return 0;
}

2018级-C++-第5章课后作业(计科1班、创新班、辅修班)

https://blog.tootal.xyz/posts/2018cpp-hw5/

作者

黄智权

本文发布于

2018-12-06

本文更新于

2018-12-06

许可协议

评论