1 大数加减
Time Limit: 1000MS(*)
You are given two integernumbers X and Y. Write a program to calculate X+Y and X-Y.
Input
The first line of the input file contains a single integer N, the number of test cases. The following N lines each contains two integers----X and Y ( 0 < X,Y <=10100 ).
Outpt
Print the value of X+Y, X-Y on a separate line.
Sample input and output
In | out |
3 |
|
555559 11111 | 566670 544448 |
9999999999 6 | 10000000005 9999999993 |
800005555 9966660000 | 10766665555 -9166654445 |
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int T,i,j,k,c,flag;
char a[110],b[110],tmp[110];
int add[100],sub[110];
cin >> T;
while( T-- ){
flag=0;
cin >> a >> b;
if( strlen(a) < strlen(b) || strlen(a) == strlen(b) && strcmp( a , b ) < 0 )
{ strcpy(tmp,a),strcpy(a,b),strcpy(b,tmp); flag = 1; }
c = k = 0;
for( i = strlen(a) - 1,j = strlen(b) -1; i >= 0 && j >= 0 ; i-- , j--)
{
add[k++] = (a[i] + b[j] - 96 + c) % 10;
if( a[i] + b[j] - 96 + c >= 10) c = 1;
else c = 0;
}
for( ; i >= 0; i-- )
{
add[k++] = (a[i] - 48 + c) % 10 ;
if(a[i] - 48 + c >= 10) c = 1;
else c = 0;
}
if(c)add[k++]=1;
for(i = k - 1; i >= 0; i--)
cout << add[i];
cout << " ";
c = k = 0;
for( i = strlen(a) - 1,j = strlen(b) - 1; i >= 0 && j >= 0 ; i-- , j--)
{
sub[k++] = (a[i] - b[j] + c + 10) % 10;
if( a[i] - b[j] + c < 0) c = -1;
else c = 0;
}
for( ; i >= 0; i-- )
{
sub[k++] = (a[i] - 48 + c + 10) % 10;
if(a[i] - 48 + c < 0)c = -1;
else c = 0;
}
if(flag)cout<<'-';
for(i = k - 1; i >= 0; i--)if(sub[i])break;
for(k = i; k>=0; k--)cout<<sub[k];
cout << endl;
}
return 0;
}
2 艺术品
Dr.Kong设计了一件艺术品,该艺术品由N个构件堆叠而成,N个构件从高到低按层编号依次为1,2,……,N。艺术品展出后,引起了强烈的反映。Dr.Kong观察到,人们尤其对作品的高端部分评价甚多。
狂热的Dr.Kong一激动,对组成该艺术品的N个构件重新组合,比如:把第6层到第12层的构件搬下来,想一想,然后整体放到剩下构件的第7层下面;过一会儿,又把第2层到第9层的构件搬下来,整体放到剩下构件的第1层下面等等。于是,Dr.Kong在进行了连续若干次“搬来搬去”后,还是这N个构件,又诞生了一件新的艺术品。
编程:请输出新的艺术品最高十层构件的编号。
【标准输入】
第一行: N K 表示构件的总数和“搬来搬去”的总次数
第2~K+1行:A B C 表示要搬动的构件(即从第A层到第B层)整个放在第C层下面;如果C等于0,则要搬动的构件将放到最高层。
【标准输出】
由十行组成,分别为组成新艺术品的第一层到第十层构件的编号。
【约束条件】
(1) 10≤N≤20000 1≤k≤1000
(2) 1≤A≤B≤N, 0≤C≤N-(B-A+1)
【 样 例 】
标准输入 | 标准输出 |
13 3 6 12 1 2 9 0 10 13 8
| 6 7 8 9 10 11 12 2 3 4 |
#include<iostream>
using namespace std;
#define max(a,b) a>b?a:b
struct good{
int ID;
good *next;
};
good *link,*temp,*last,*top;
void change(int a,int b,int c)
{
int m=max(max(a,b),c);
good *A,*B,*C;
last=link;
for(int i=1;i<=m;i++)
{
if(i==a-1)A=last;
if(i==b)B=last;
if(i==c)C=last;
last=last->next;
}
temp=A->next;
A->next=B->next;
B->next=C->next;
C->next=temp;
}
int main()
{
int n,total,a,b,c; cin>>n;
link=temp=last=NULL;
for(int i=0;i<n;i++)
{
temp=new good;
temp->ID=i+1;
if(link==NULL)
top=link=last=temp;
else
{
last->next=temp;
last=temp;
}
}
cin>>total;
while(total--)
{
cin>>a>>b>>c;
if(c!=0)
change(a,b,c);
else {
good *A,*B;
last=link;
for(int i=1;i<=b;i++)
{
if(i==a-1)A=last;
if(i==b)B=last;
last=last->next;
}
top=A->next;
A->next=B->next;
B->next=link;
link=top;
}
}
for(i=0;i<10;i++)
{
cout<<link->ID<<endl;
link=link->next;
}
return 0;
}
3、Dr.Kong的机器人
Dr.Kong设计了一个可以前进或后退机器人,该机器人在每个位置i会得到一个移动步数的指令Ki (i=1,2…N),聪明的机器人自己会判断是要前进Ki步还是后退Ki步。
例如:给定指令序列(3 3 1 2 5),表示机器人在第1个位置时,可以前进3步到第4个位置,此时后退是不起作用的,出界;机器人在第2个位置时,可以前进3步到第5个位置,此时后退是不起作用的,出界;机器人在第3个位置时,可以前进1步到第4个位置,也可以后退1步到第2个位置等等。
你认为,对给定的两个位置A,B, 聪明的机器人从A位置走到B位置至少要判断几次?
【标准输入】
第一行: M 表示以下有M组测试数据(0<M<=8)
接下来每组有两行数据
头一行:N A B ( 1≤ N≤ 50, 1≤A,B ≤N )
下一行: K1 K2…..Kn ( 0<=Ki<=N )
【标准输出】
输出有M行,第i行为第i组测试数据的最少判断次数, 若无法到达,则输出-1。
【 样 例 】
标准输入 | 标准输出 |
2 5 1 5 3 3 1 2 5 8 5 3 1 2 1 5 3 1 1 1 | 3 -1 |
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct pos
{
int x,step;
};
int main(){
int visit[51];
int M,N,s,e;
queue<pos>p;
pos tmp,tmp1;
int a[51];
cin >> M;
while(M--){
while(!p.empty())p.pop();
memset(visit,0,sizeof(visit));
cin >> N;
cin >> s >> e;
tmp.x = s;tmp.step = 0;
p.push(tmp);
for(int i = 1; i <= N; i++)
cin >> a[i];
while(!p.empty()){
tmp = p.front();
p.pop();
visit[tmp.x] = 1;
if(tmp.x == e){ cout << tmp.step << endl; break; }
tmp1.x = tmp.x + a[tmp.x];
tmp1.step = tmp.step + 1;
if(tmp1.x > N || visit[tmp1.x]) ;
else p.push(tmp1);
tmp1.x = tmp.x - a[tmp.x];
tmp1.step = tmp.step + 1;
if(tmp1.x < 1 || visit[tmp1.x]) ;
else p.push(tmp1);
}
if(!visit[e])
cout << -1 << endl;
}
return 0;
}
4. 约瑟夫环问题:
设编号为1,2,3,……,n的n(n>0)个猴子按顺时针方向围坐一圈,每个猴子持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个猴子开始顺时针方向自1起顺序报数,报到m时停止报数,报m的猴子出列,将它的密码作为新的m值,从它的下一个猴子开始重新从1报数。如此下去,直到所有猴子全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。
struct node //结点结构
{
int number; /* 人的序号 */
int cipher; /* 密码 */
struct node *next; /* 指向下一个节点的指针 */
};
#include<iostream>
using namespace std;
struct Monkey{
int ID;
int cipher; //密码,暗号
Monkey *next;
};
int main(){
Monkey *link,*monkey,*lastmonkey;
int total,num,count;
cin >> total;
link = NULL;
for(int i = 0;i < total;i++){
monkey = new Monkey;
cin>>monkey->cipher;
monkey->ID = i+1;
if(link == NULL)
link = lastmonkey = monkey;
else{
lastmonkey->next = monkey;
lastmonkey = monkey;
}
lastmonkey->next = link;
}
num = link->cipher;
count = 1;
while(link != NULL) {
if(link->next == link){
cout << link->ID;
delete link;
break;
}
if(count == num-1){
monkey = link->next;
link->next = monkey->next;
cout << monkey->ID <<endl;
delete monkey;
count = 0;
num = link->next->cipher;
}
link = link->next; count++;
}
return 0;
}
约瑟夫环这个我写的有点坑,也就是不能删除头结点或者是下次重新报数到一而自己的密码就是一的猴子。