2020.1.13

1、金字塔

#include<iostream>
using namespace std;
int main(){
  int s='A';
   printf("%d",s);//结果65
}
输入描述:
输入一个字母,保证是大写
输出描述:
输出一个字母金字塔。
例:
输入
C
输出
  A
 ABA
ABCBA

#include<iostream>
int main(){
    char n;
    scanf("%c",&n);
    for(int i=65;i<=n;i++){
     for(int j=n;j>i;j--){//2,1,0 
         printf(" ");
     }
     for(int k=65;k<=i;k++){//1,2,3 小到大
            printf("%c",k);
        }
      for(int t=i-1;t>=65;t--){//0,1,2 大到小
          printf("%c",t);
      }
        printf("\n");
    }
}

2、数列两个题对比:
可见递归数据大则复杂度特别高,会运行超时。

22160
求fib数列的第n项,前几项是11235,每一项都等于前面两项的和 
输入描述:
输入一个整数
输出描述:
输出一个整数

递归:
#include<iostream>
int Fibonacci(int n){
    if(n<1)
    {
         return 0;
    }
    else if(n==1||n==2)
    {
        return 1;
    }
    else
    {
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}
int main(){
    int m;
    scanf("%d",&m);
    printf("%d",Fibonacci(m));
}

非递归:
#include<iostream>
int main(){
    int n;
    scanf("%d",&n);
    int a=1,b=1;
    for(int i=1;i<=n-2;i++)
    {
        b=a+b;
        a=b-a;
    }
    printf("%d",b);
}

22211
现在已知Fibonacci(菲波那切)数列的前几项0112358……,编程求出第 N 项。
输入描述:
输入一行,包含一个正整数N,1 <= N <= 50
输出描述:
输出一个整数
现在已知Fibonacci(菲波那切)数列的前几项0112358……,编程求出第 N 项。 

#include<iostream>
int Fibonacci(int n){
    if(n==1){
        return 0;
    }
    if(n==2){
        return 1;
    }
    if(n>2){
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}
    
int main(){
    int N;
    scanf("%d",&N);
    printf("%d",Fibonacci(N));
    return 0;
}//运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。case通过率为80.00%。超时即说明递归复杂度过大。

非递归:
#include<iostream>
int main(){
    int n;
    scanf("%d",&n);
    long long int a=0,b=1;
    for(int i=1;i<=n-2;i++)
    {
        b=a+b;
        a=b-a;
    }
    printf("%lld",b);
}//之前错在爆int(超出了int的取值范围,int:2的32次方,ll:2的64次方),改为long long int和%lld即可

3、换钱问题

链接:https://ac.nowcoder.com/acm/problem/22197
来源:牛客网

n元人民币换成1元、2元、5元的零钱,请计算共有多少种兑换方法?
输入描述:
输入一行,包含一个整数n1 <= n <= 200
输出描述:
输出一行,包含一个整数

#include<iostream>
int main(){
    int n;
    scanf("%d",&n);
    int count=0;
    for(int i=0;i<=n/5;i++)
    {
        for(int j=0;j<=n/2;j++)
        {
            for(int k=0;k<=n;k++)
            {
                if((i*5+j*2+k)==n)
                {
                    count++;
                }
            }
        }
    }
    printf("%d",count);
}
链接:https://ac.nowcoder.com/acm/problem/22214
来源:牛客网

牛可乐在牛牛商场买了一个帽子,要支付c元金币,牛牛商场一律不找零钱,牛可乐手里有不限数量的面值a元的金币和面值b元的金币,请问牛可乐可以用金币刚好凑出总价c元吗? 
输入描述:
输入一行,包含三个整数a,b,c  a,b <= 100, c <= 10000
输出描述:
输出一行,如果可以输出”Yes”,否则输出”No”.

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int a,b,c;
    int i,j;
    scanf("%d%d%d",&a,&b,&c);
    for( i=0;i<=c/a;i++){
        for( j=0;j<=c/b;j++){
            if(i*a+j*b==c){
             {  
                 printf("Yes");
                return 0;
              }
            }
        }
    }
    if((i==c/a+1)&&(j==c/b+1))
    {
        printf("No");
    }
}
//仅60%错在No部分忘了都+1!

4、约数

最大公约数:

如果遇到一个数很大,另一个数比较小的情况,可能要进行很多次减法才能达到一次除法的效果,从而使得算法的时间复杂度退化为O(N),其中N是原先的两个数中较大的一个。相比之下,辗转相除法的时间复杂度稳定于O(logN)。

更相减损术
1)任意两个正整数,同为偶数则用2约简,否则2);
2)先大数减小数,差与较小数比较,辗转相减至差与减数相等;
3)1)中约掉的若干2与2)中最终等数乘积即为所求最大公约数。

链接:https://ac.nowcoder.com/acm/problem/22164
来源:牛客网

利用更相减损术求两个整数的最大公约数,即每次将较大的数变成大数减去小数的值
输入描述:
输入两个正整数,范围在1000000以内
输出描述:
输出一个整数
#include<iostream>
int main(){
   int m,n;
   int count=0;
   scanf("%d%d",&m,&n);
   while(m!=n)
   {
       if(m>n)
       {
           m=m-n;
       }
       else
       {
           n=n-m;
       }
   }
   printf("%d",m);
}

辗转相除法
大数除以小数,小数除以余数至大数%小数=0,最后除数为两数最大公约数。

链接:https://ac.nowcoder.com/acm/problem/22215
来源:牛客网

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。给你两个数,请输出他们的最大公约数。
输入描述:
输入一行,包含两个正整数A,B 1 <= A,B <= 1e9
输出描述:
输出一行,包含一个正整数
#include<iostream>
using namespace std;
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    int i,j,r;
    for(i=(a>=b)?a:b,j=(a>=b)?b:a; j!=0; r=i%j,i=j,j=r);//int不能在for内,注意同时变化要新赋给i、j
    printf("%d",i);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值