题目列表 > A + B 时间限制: 1000ms 内存限制: 1024MB 描述 输入两个正整数A和B, 求A+B的值 输入 两个正整数A, B 输出 A+B的和 对于小数据, 0 < A, B <= 10; 对于大数据, 0 < A, B <= 10100 样例输入 2 3 样例输出 5 #include<iostream> #include<cstring> using namespace std; int* strtoint(char *str) { int i,len=strlen(str); int* a=new int[(len+1)*sizeof(int)]; for(i=0;i<len;i++) a[i]=(int)str[len-i-1]-48; return a; } char* inttostr(int* a,int n) { int i; char* str=new char[(n+1)*sizeof(char)]; for(i=0;i<n;i++) str[i]=(char)a[n-i-1]+48; str[n]='\0'; return str; } int check(int* a,int n) { int k=0,len=n; while(a[len-1]==0&&len>1) len--; for(k=0;k<len;k++) if(a[k]>=10) { a[k+1]=a[k+1]+a[k]/10; a[k]=a[k]%10; } if(a[k]!=0) len=k+1; return len; } char* addition(char* m1,char* m2) { int i,len1,len2,len,c=0; int* t1,*t2; len1=strlen(m1); len2=strlen(m2); len=(len1>=len2)?len1:len2; t1=new int[(len+2)*sizeof(int)]; t2=new int[(len+2)*sizeof(int)]; t1=strtoint(m1); t2=strtoint(m2); for(i=len1;i<len+1;i++) t1[i]=0; for(i=len2;i<len+1;i++) t2[i]=0; for(i=0;i<len;i++) t1[i]+=t2[i]; len=check(t1,len); return inttostr(t1,len); } int main() { char m1[1000],m2[1000]; while(cin>>m1>>m2) cout<<addition(m1,m2)<<endl; return 0; }
题目列表 > 石头剪刀布 时间限制: 1000ms 内存限制: 1024MB 描述 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期的。请问,小A和小B比了N轮之后,谁赢了? 输入 输入的第一行包含一个整数K,表示K组测试数据。 之后的每组测试数据包含三行。第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。第二行包含NA个整数,表示小A出拳的规律,第三行包含NB个整数,表示小B出拳的规律。其中,0表示“石头”,2表示“剪刀”,5表示“布”。 对于小数据,0 < K,N,NA,NB <= 10;对于大数据,0 < K,N,NA,NB <= 100; 输出 对于每组测试数据,输出一行。如果小A赢了,输出A;如果小B赢了,输出B;如果两人打平,输出draw。 提示 对于第一组测试数据,猜拳过程为: A:0 2 5 0 2 5 0 2 5 0 B:0 5 0 2 0 5 0 2 0 5 所以A赢了4轮,B赢了2轮,双方打平4轮,所以A赢了。 对于第二组测试数据,猜拳过程为: A:2 0 5 2 0 B:0 2 5 0 2 所以A赢了2轮,B赢了2轮,双方打平1轮,所以最终打平了。 样例输入 2 10 3 4 0 2 5 0 5 0 2 5 3 3 2 0 5 0 2 5 样例输出 A draw #include<stdio.h> int a[101],b[101]; int main() { int n,t,na,nb,i,ansa,ansb; scanf("%d",&t); while(t--) { ansa=ansb=0; scanf("%d %d %d",&n,&na,&nb); for(i=0;i<na;i++) scanf("%d",&a[i]); int j=i; while(j<n) { for(i=0;i<na;i++) a[j++]=a[i]; } for(i=0;i<nb;i++) scanf("%d",&b[i]); j=i; while(j<n) { for(i=0;i<nb;i++) b[j++]=b[i]; } for(i=0;i<n;i++) { if(a[i]==b[i]) continue; else if(a[i]==0) { if(b[i]==2) ansa++; else if(b[i]==5) ansb++; } else if(a[i]==2) { if(b[i]==0) ansb++; else if(b[i]==5) ansa++; } else if(a[i]==5) { if(b[i]==2) ansb++; else if(b[i]==0) ansa++; } } if(ansa>ansb) printf("A\n"); else if(ansa<ansb) printf("B\n"); else if(ansa==ansb) printf("draw\n"); } return 0; }
/*题目列表 > 踩方格 时间限制: 1000ms 内存限制: 1024MB 描述 有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设: a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上; b. 走过的格子立即塌陷无法再走第二次; c. 只能向北、东、西三个方向走; 请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。 输入 允许在方格上行走的步数n 输出 计算出的方案数量 对于小数据1 <= n <= 20; 对于大数据1 <= n <= 100. 样例输入 2 样例输出 7 */ #include <stdio.h> #include <string.h> #define N 105 char c[N],tem[N]; char res[N][N]; void Add(char* a,char* b) { int la,lb,len,i,r,res,j; la = strlen(a); lb = strlen(b); len = la>lb?la:lb; r = 0; for (i=0; i<len; i++) { if (i >= la) res = b[lb-i-1]+r-'0'; else if (i >= lb) res = a[la-i-1]+ r-'0'; else res = a[la-i-1]+ b[lb-i-1]+ r-2*'0'; r = res / 10; tem[i] = res %10+'0'; } if (r > 0) tem[i++] = r%10+'0'; for (j = 0; j < i; j++) c[j] = tem[i-j-1]; c[j] = 0; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int n; strcpy(res[0],"1"); strcpy(res[1],"3"); for (int i = 2; i <= 100; i++) { Add(res[i-1],res[i-1]); strcpy(res[i],c); Add(res[i],res[i-2]); strcpy(res[i],c); } while(scanf("%d",&n)!=EOF) printf("%s\n",res[n]); return 0; }