第一次作业
/*
67.取石头 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
有一堆石子,A,B两人
轮流从中取出石子,每次取出的石子数目只能为1,3,7或8,最后一枚石子谁取到就是输方。
A,B两人都足够聪明,不会做出错误的判断。现给出一定数目的石子,A先取石子,计算A最终是输是赢,赢用1表示,
输用0表示.
输入描述
第一行为一个整数n(0< n <=100),表示玩n局,接下来n行每行有一个整数,表示对应的局提供的石子数(不大于
10000),
输出描述
编程输出A对应的n局是赢是输,赢输出1,输输出0.
输入样例
3
1
3
10
输出样例
0
0
1
*/
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn = 1001;
int f[maxn];
int game(int x){
f[0]=1;f[1]=0;f[2]=1;f[3]=0;f[4]=1;f[5]=0;f[6]=1;f[7]=0;f[8]=1;
for(int i=9;i<=x;i++)
f[i]=!(f[x-1]&&f[i-3]&&f[i-7]&&f[i-8]);
return f[x];
}
int main(){
int n;
cin>>n;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
cout<<game(x)<<endl;
}
return 0;
}
/*499.最大公约数 (10分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
欧几里得原理:
用GCD(A,B)表示两个正整数A和B的最大公约数(GCD是最大公约数的英文Greatest Common Divisor的简写)。
不妨认为A>B,那么GCD(A,B) =GCD(A-B,B)。 也就是把其中较大的一个数变为两数之差后,最大公约数不会变。
例如 GCD(36,14)= GCD (36-14, 14)=GCD(22,14)
现要求利用欧几里得原理,设计一个程序,求两个整数的最大公约数。
输入描述
输入两个整数A,B, 中间用空格间隔。
输出描述
输出A和B的最大公约数
输入样例
14 8
输出样例
2
*/
#include<iostream>
#include<stdio.h>
using namespace std;
int GCD(int a,int b){
if(b==0) return a;
if(a<b){
int t;
t=a;
a=b;
b=t;
}
GCD(a-b,b);
}
int main(){
int a,b;
cin>>a>>b;
cout<<GCD(a,b)<<endl;
return 0;
}
/*1497.传球问题 (20分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
现有四个人做传球游戏,要求接球后马上传给别人。由甲先传球,并作为第1次传球,求经过n次传球仍回到发球人甲手中的传球方式的种数。
输入描述
整数n,已知n<20
输出描述
传球方式数
输入样例
10
输出样例
14763*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn = 20;
int g[maxn],f[maxn];//f记录的是从甲传球再传回甲中途传球的次数,g记录的是从乙传球传回甲传球的次数
int main(){
int n;
cin>>n;
memset(g,0,sizeof(g));
memset(f,0,sizeof(f));
f[0] = 0,g[1] = 1,f[1]=0;//当n==1是,甲传给别人,无法传回自己,所以为0;
for(int i=2;i<=n;i++){
f[i] = 3*g[i-1];
g[i] = 2*g[i-1] + f[i-1];
}
cout<<f[n]<<endl;
return 0;
}