一、输出箭形图案
解析:
分析图案特征:打点的是空格
如果输入的为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依次往右移动一位,进行匹配。