c语言-循环题目-牛客

一、输出箭形图案

 解析:

分析图案特征:打点的是空格

如果输入的为n,*的数量是以1为增量递增,再以1为增量递减的,最大达到的值应为n+1

空格的数量是根据n,最大应有的空格数为:2*n,先以-2的速度递减,后以+2的速度增加

 代码:

#include<stdio.h>
#include<string.h>
int main()
{
    int nu;
    int t=0;
    while(scanf("%d",&nu)!=EOF)
    {
    t=(2*nu+1)/2+1;
    int l=0;
    for (int i=1;i<=t;i++)
    {
        
        l=(nu*2-(i-1)*2);//4 2
        for(int j=1;j<=l;j++)
        {
            printf(" ");
        
        }
        for(int k=1;k<=i;k++)
        {
            printf("*");
        }
        printf("\n");
         
    }
    for (int i=1;i<=t-1;i++)
    {
        l=i*2;//2 4
        for(int j=1;j<=l;j++)
        {
            printf(" ");
            
        }
        
        for(int k=1;k<=nu;k++)
        {
            
            printf("*");
    
        }
        printf("\n");
        nu=nu-1;

    
    }

    }
    
    
    


}

二、牛牛学数列(2)

题目:

分析:这个题目有很多基础知识,首先对于小数的定义,一般使用double来定义,减少出错,其次c语言中浮点数的除法一定要转换为浮点数。float类型通常是单精度浮点数,占用32位(4字节),用于表示较小范围内的小数,精度约为6-7位小数。double类型通常是双精度浮点数,占用64位(8字节),提供更高的精度,可以表示更大范围内的小数,精度约为15-16位小数。

代码:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    double sum;
    for(int i=1;i<=n;i++)
    {
        
        sum+=1.0/i;


    }
    printf("%.6lf",sum);
    

}

三、牛牛学数列5

解析:fib(即斐波拉契数列),前两项为1,我们需要提前规定其为1,1。从数列的第二项开始,等于前两项之和,也就是i-1和i-2,利用循环写出来就好了。

代码:

#include<stdio.h>
int main()
{

    int n;
    int a[100]={1,1};//
    int su;
    scanf("%d",&n);
    for(int i=2;i<n;i++)
    {

        a[i]=a[i-1]+a[i-2];
    }
    
    printf("%d",a[n-1]);
}

四、金币

题目:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

题目描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。

请计算在前K天里,骑士一共获得了多少金币。

输入描述:

输入只有1行,包含一个正整数K,表示发放金币的天数。

输出描述:

输出只有1行,包含一个正整数,即骑士收到的金币数。

解析:由题可知,是一个循环嵌套问题,循环的结束应以输入天数和循环进行天数相等时结束循环。我们通过k++,来增加每天的天数。便于理解举个例子:如果天数为3,那么第一次进入循环i=1,那么k也会等于1,所以第一天sum就积累到1,由于不满足if里面的条件,所以继续循环,i=2,j=1,那么k=2,sum=3,j=2,那么k=3,sum=5,注意内层循环记录的是天数。

代码:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int k=0;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            k++;
            sum+=i;
            if(k==n)
            {
                printf("%d",sum);
            }
        }
    
    }
    



}

五、有趣的二进制

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有效位是有限的,但是没有告诉他这是为什么,后来他发现0.1的二进制是一个无限循环小数0.000110011001100110011001100···,如果只取27位小数,再转换成十进制的话就变成了0.09999999403953552,小新开心的解决了这个问题。与此同时,小新又有了一个新的问题:一个数在64位二进制补码表示下,一共有多少个1。因为小数有无解的情况,所以我们保证输入的都是整数。

 代码:

#include<stdio.h>
int main(){
 unsigned long long n;
    while(scanf("%lld",&n)!=EOF){
        int sum=0;
        while(n!=0){
            if(n&1)
            {
            sum++;
            n>>=1;
            }
        }
        printf("%d\n",sum);
    }
}

解析:

定义:定义无符号数是为了减少空间复杂度,不超时

输入:连续输入的写法。

运算:采用移位运算符和按位与运算符运算符,n&1(相当于n%2==1)表示判断n的二进制最后一位是否等于1,sum++,n依次往右移动一位,进行匹配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值