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(){ 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
|
#include <iostream> using namespace std; int main(){ 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(){ 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(){ 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){ cout<<head->data<<' '; head=head->next; } cout<<endl; ch=getchar(); ch=getchar(); } 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){ 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(){ 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; }
|