#include <stdio.h>
int main()
{
int n,m;
int a[41];
a[0]=a[1]=0;//由于刚开始时你在第一级所以a[0],a[1]均为0
a[2]=1;
a[3]=2;
for(int i=4;i<=40;i++){
a[i]=a[i-1]+a[i-2];//第i层的走法数为第i-1的走法数与第i-2的走法数
}
scanf("%d",&n);
while(n--){
scanf("%d ",&m);
if(a[m]!=0){//注意这里如果m为0或1时不合法
printf("%d\n",a[m]);
}
}
return 0;
}
#include <stdio.h>
int main()
{
int n,m;
scanf("%d",&n);
while(n--){
int sum=3;//初始羊的数量
scanf("%d ",&m);
for(int i=0;i<m;i++){
//过完收费站后羊的数量减去一个退回的羊即过收费站之前羊的数量
sum=(sum-1)*2;
}
printf("%d\n",sum);
}
return 0;
}
2043.密码
#include <stdio.h>
#include <string.h>
//判断密码中的字符是否来自下面“字符类别”中四组中的至少三组。
//这四个字符类别分别为:
//1.大写字母:A,B,C...Z;
//2.小写字母:a,b,c...z;
//3.数字:0,1,2...9;
//4.特殊符号:~,!,@,#,$,%,^;int getRes(char *str){
int a[4];//记录不同组的字符数
int count=0;
for(int i=0;i<4;i++){
a[i]=0;
}
for(int i=0;i<strlen(str);i++){
if(str[i]>='A'&&str[i]<='Z'){
a[0]++;
}
if(str[i]>='a'&&str[i]<='z'){
a[1]++;
}
if(str[i]>='0'&&str[i]<='9'){
a[2]++;
}
if(str[i]=='~'||str[i]=='!'||str[i]=='@'||str[i]=='#'
||str[i]=='$'||str[i]=='%'||str[i]=='^'){
a[3]++;
}
}
for(int i=0;i<4;i++){
if(a[i]!=0){//如果不为0即字符串中存在该组字符
count++;
}
}
if(count>=3){//密码中的字符来自下面“字符类别”中四组中的至少三组。
return 1;
}
return 0;
}
int main()
{
int n,m,len;
scanf("%d",&n);
while(n--){
char str[50];
int flag=0;//记录是否满足安全密码要求
scanf("%s",str);
len=strlen(str);
//如果不满足密码长度大于等于8,且不要超过16。就不合法
if(len<8|len>16){
flag=1;
}
int num=getRes(str);
if(num==0){
flag=1;
}
if(flag==1){
printf("NO\n");
}else{
printf("YES\n");
}
}
return 0;
}
#include <stdio.h>
int main() {
int n;
long long result[51] = {0}; // 使用 long long 防止溢出
// 初始化 result 数组
result[1] = 1; // 当 b - a = 1 时,只有一种走法
result[2] = 2; // 当 b - a = 2 时,有两种走法
// 递推计算 result 数组
for (int i = 3; i <= 50; i++) {
result[i] = result[i - 1] + result[i - 2]; // 递推公式
}
scanf("%d", &n); // 读取测试实例的个数
while (n--) {
int a, b;
scanf("%d %d", &a, &b); // 读取蜂房编号 a 和 b
// 计算 b - a 的差值
int diff = b - a;
printf("%lld\n", result[diff]); // 输出结果
}
return 0;
}
#include <stdio.h>
/*递推公式
a(n) = 2 * a(n-1) + a(n-2)
①第n-1个方格的颜色与第1个方格的颜色不同,
则第n个方格的颜色只有一种选择即a(n-2)
②第n-1个方格的颜色与第1个方格的颜色相同,
则第n个方格的颜色有两种选择又第n-2个元素和第一个元素肯定不同色
所以这种情况下选择数为a(n-1)*2
*/
int main()
{
int n,num;
long long a[51];
a[0]=0;
a[1]=3;
a[2]=6;
a[3]=6;
for(int i=4;i<=50;i++){
a[i]=2*a[i-2]+a[i-1];
}
while(scanf("%d",&num) != EOF){
printf("%lld\n",a[num]);
}
}
#include <stdio.h>
/*
2*1:1
2*2:2
2*3:3
2*4:5
2*5:8
2*6:13
...
由此得出递推公