杭电OJ基础100题2041-2060答案(C语言版)

2041.超级楼梯

#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;

}

2042.不容易系列之二

#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;

}

2044.一只小蜜蜂...

#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;
}

2045.不容易系列之(3)—— LELE的RPG难题

#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]);
  }

}

2046.骨牌铺方格

#include <stdio.h>
/*
 2*1:1
 2*2:2
 2*3:3
 2*4:5
 2*5:8
 2*6:13
 ...
 由此得出递推公
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值