蓝桥杯练习题笔记--1016~1030

二、1016~1030

1016: [编程入门] 水仙花数判断

题目:打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=111+555+333。

代码如下(C):

#include <stdio.h>
#include<math.h>

int main()
{

	for (int i = 100; i <= 999; i++)
	{
		if (i == (pow(i / 100, 3) + pow(i % 10, 3) + pow(i / 10 % 10, 3)))
			printf("%d\n", i);
	}
	return 0;
}

代码如下(C++):

#include<iostream>
using namespace std;

int main()
{
	int i, a, b, c;
	for (i = 100; i <= 999; i++)
	{
		a = i / 100;
		b = i / 10 % 10;
		c = i % 10;
		if (i == a*a*a + b*b*b + c*c*c)
			cout << i << " ";
	}
return 0;
}

1018: [编程入门] 有规律的数列求和

题目:有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前N项之和,保留两位小数。

代码如下(C):

#include<stdio.h>

int main()
{
	int n=10;
	double a,b,c;
	scanf("%d",&n);
	a=1;//第n项
	b=0;//前n项和
	c=2;//第n项的值
	while(a<=n)
	{
		b=b+c; //将数列的前n项和+第n+1的项的值赋值给数列的前n项和
		c=1+(1/c);//将第 n+1的项的值的倒数+1赋值给第n+2的项的值
		a=a+1;//将第n项+1项赋值给第n+1项
	}
	printf("%.2f",b);
	return 0;
}

代码如下(C++):

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    double a=1,b=1,c=0,sum=0;
    int i,N;
    cin>>N;
    
    for(i=0;i<N;i++)
    {
        sum+=(a+b)/a;
        c=b;
        b=a;
        a=a+c;
    }
    cout<<fixed<<setprecision(2)<<sum<<endl;
    return 0;
}

1019: [编程入门] 自由下落的距离计算

题目:一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数

代码如下(C):

#include"stdio.h"
int main()
{
    int num;                           //次数
    double iterm=0,sum=0,high;         //一定要初始化,不然后果不堪设想                             
    scanf("%lf %d", &high, &num);

    for(int i = 0; i < num; i++)       //循环的开始和结束注意一下
    { 
        if(i==0)                       
            sum+=high;                //加上最后一次反弹               
        else 
            sum+=2*high;              //中间过程
        high=high/2.0;                //下次反弹前面的二分之一;
        //printf("%0.2lf %0.2lf\n",high,sum);  //high=(double)high/2;强制转换
    }
    printf("%0.2lf %0.2lf\n",high,sum); //注意格式别错了
    return 0;
}

代码如下(C++):

/*****************************************************
cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2);
:输出一个右对齐的小数点后两位的浮点数。
setiosflags(ios::fixed):用定点方式表示实数
setiosflags(iso::right):在指定区域内右对齐输出
setprecision(n):控制输出流显示浮点数的数字个数

setiosflags(ios::skipws):忽略前导空白
setiosflags(ios::uppercase):16进制数大写输出
setiosflags(ios::lowercase):16进制数小写输出
setiosflags(ios::showpoint):强制显示小数点
*****************************************************/
#include<iostream>
#include<iomanip>//引入setprecision的头文件
#include<math.h>//引入pow函数的头文件
using namespace std;

int main()
{
    double m,n;//声明初始小球高度m和弹跳次数n
    double h,s=0.0;//声明小球第n次弹跳高度h和总路程s
    cin>>m>>n;
    h=m/pow(2.0,n);//每次弹跳高度减半m*0.5^n
    for(int i=0;i<n-1;i++)
    {
        s+=(pow(1.0/2.0,i)*m);//第一次只有下落高度没有上升高度,计算除第一次弹跳路程之和
    }
    cout << setiosflags(ios::fixed) << setprecision(2); //保留两位小数
    cout << h <<" "<< s+m;//加上第一次下落高度并保留两位小数输出
    //cout<<fixed<<setprecision(2)<<h<<" "<<s+m;//加上第一次下落高度并保留两位小数输出
    return 0;
}

1020: [编程入门] 猴子吃桃的问题

题目:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

代码如下(C):

# include <stdio.h>
 
int main()
{
    int sum=1,N;
    scanf("%d",&N);
    while(--N)
        sum=(sum+1)*2;
    printf("%d",sum);
 
    return 0;
}

代码如下(C++):

#include<iostream>
using namespace std ;

int main()
{
    int n ; 
    cin>>n ;
    int sum= 1 ;//桃子总和 
    for(int i = 1;i <= n - 1;i++)//ps:是循环n-1次 
    {
        sum += 1 ;//多吃的桃子 
        sum *= 2 ;//加一倍 
    }
    cout << sum << endl ;
    return 0 ;
}

1022: [编程入门]筛选N以内的素数

题目:用简单素数筛选法求N以内的素数。

代码如下(C):

#include<stdio.h>
int main()
{
    int num;               
    scanf("%d", &num);
    for(int i=2; i <= num; i++)     //因为 1 不是素数,所以 i 要从 2 开始
    {
        int count=0;                // a 必须在for循环中重新赋值,否则会出错
        for(int j=2; j < i; j++)    //第二个循环判断 i 能否能被其它数整除
        {
            if(i%j == 0)            //如果 i 能被其它数整除,a 就自增
            count++;    
        }
        if(count==0)            //判断 a=0 如果这个数除了本身和 1 没有数能整除它就输出
            printf("%d\n",i);   //输出这边注意要换行
    }
    return 0;
}

代码如下(C++):欧拉筛

#include<bits/stdc++.h>
using namespace std;
int p[50000];
int ans[50000];
int t=0;
void getans(int n)
{
    memset(p,0,sizeof(p)); 
    for(int i=2;i<=n;i++)
    {
        if(!p[i]) ans[t++]=i;//将素数存入ans中 
        for(int j=0;j<t&&i*ans[j]<=n;j++)
        {
            p[i*ans[j]]=1;//关键循环,把所有素数的n倍都标记为非素数,这就是筛法 
            if(i%ans[j]==0) break;//欧拉筛法关键步骤,详情搜索欧拉函数 
        }
    }
}
int main()
{
    int n;
    cin>>n;
    getans(n);
    for(int i=0;i<t;i++) cout<<ans[i]<<endl;
}

1024: [编程入门]矩阵对角线求和

题目:求一个3×3矩阵对角线元素之和。

代码如下(C):

#include<stdio.h>
int main()
{
    int sum1=0, sum2=0, a[3][3];
    for(int x=0; x<3; x++)
    {
        for(int y=0; y<3; y++) 
        {
            scanf("%d", &a[x][y]);//怎么敢放在这?
            if(x == y)
                sum1 += a[x][y];
            if(x+y == 2)
                sum2 += a[x][y];
        }
    }
    printf("%d %d", sum1, sum2);
    return 0;
}

代码如下(C++):

#include<iostream>
using namespace std;
int main() 
{
    int a[9] = { 0 };
    for (int i = 0; i < 9; i++) 
        cin >> a[i];

    cout << a[0] + a[4] + a[8] << " " << a[2] + a[4] + a[6] << endl;
}

1025: [编程入门]数组插入处理

题目:已有一个已正序排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。

代码如下(C):

#include <stdio.h>
 
int main()
{
    int a[10];
    int i=0;
    int t;
    for(i=0;i<9;i++)
    {
        scanf("%d",&a[i]);
    }
    a[9]=0;
    int x;
    scanf("%d",&x);
    for (i=0;i<10;i++)
    {
        if(x>=a[i] && x<=a[i+1])//缺点:插入的数在其中间
        {
            t=i+1;
            break;
        }
    }
//  printf("%d\n",t);
    for (i=9;i>t;i--)
    {
        a[i]=a[i-1];
    }
    a[t]=x;
 
    for (i=0;i<10;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

代码如下(C++):

/***********************************************************************
 lower_bound:从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,
              找到返回该数字的地址,不存在则返回end
 upper_bound:从数组的begin位置到end-1位置二分查找第一个大于num的数字,
              找到返回该数字的地址,不存在则返回end
***********************************************************************/

#include<bits/stdc++.h>
using namespace std;
 
int main(void)
{
    vector<int> array;     //array是一个二维的int型的vector(实际上相当于一个二维数组)
    int t, num;
    for(int i = 0; i < 9; i++)
    {
        cin >> t;
        array.push_back(t);//将一个新的元素加到vector的最后面,未排序
    }  
    cin >> num;            //回车后输入
   
    auto pos = upper_bound(array.begin(), array.end(), num);
    array.insert(pos, num);

    for(int i = 0; i < 10; i++)
        cout << array[i] << " ";
        
    cout << endl;
    return 0;
}


1026: [编程入门]数字逆序输出

题目:输入10个数字,然后逆序输出。

代码如下(C):

#include<stdio.h>
int main()
{
    int a[10],i,j;
    for(i=0;i<10;i++)        //注意这边是从i=0开始,到i<10
        scanf("%d",&a[i]);
    for(j=9;j>=0;j--)        //数组逆序输出,我们可以从j=9开始,一直做到j<0,就结束循环
        printf("%d ",a[j]);  //注意这边输出要空格隔开
    return 0;
}

代码如下(C++):入栈 出栈

#include<iostream>
using namespace std;
int main()
{
    int j[11],top=1;//如果是大神可以用10个数组,但初学者还是用11个好了,这样可以一一对应。
    while(top!=11)
        {
        cin>>j[top];
        top++;//输入各个数据并入栈,并且将输入的号码+1
    }
    top-=1;//让top=10,否则之后的输出会出错
    while(top!=0)
    {
        cout<<j[top]<<" ";
        top--;//各个数据出栈,依次是号码为10,9,8,7,6......
    }
    return 0;//最后结束
}

1028: [编程入门]自定义函数求一元二次方程

题目:求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。

代码如下(C):

#include<stdio.h>
#include<math.h>

double over(double a,double b,double c);
double below(double a,double b,double c);

int main()
{
    double a,b,c;
    scanf("%lf%lf%lf", &a, &b, &c);
    double del = b*b-4*a*c;
    if(del>=0)
        over(a,b,c);
    else 
        below(a,b,c);
    return 0;
}

double over(double a,double b,double c)
{
    double del=sqrt(b*b-4*a*c);
    printf("x1=%.3lf x2=%.3lf",(-b+del)/(2*a),(-b-del)/(2*a));//大于等于0都可以调用这个函数
    return 0;
}

double below(double a,double b,double c)
{
    double del=sqrt((4*a*c-b*b)/(4*a*a));
    printf("x1=%.3lf+%.3lfi x2=%.3lf-%.3lfi",-b/(2*a),del,-b/(2*a),del);
    return 0;
}

代码如下(C++):

#include"iostream" 
#include"cmath"   //调用sqrt()开平方函数
#include"cstdio"  //调用printf()控制格式化输出
using namespace std;
 
float x1,x2,a,b,c,z;
  
void func1(){  //大于零 
    x1=( -b+sqrt(z) )/( 2*a );
    x2=( -b-sqrt(z) )/( 2*a );
}
 
void func2(){  //等于零 
    x1=x2=( -b )/( 2*a );
}
 
void func3(){  //小于零 
    z=sqrt(-z);
    printf("x1 = %.3f+%.3fi\nx2 = %.3f-%.3fi\n", -b/(2*a), z/(2*a), -b/(2*a), z/(2*a));
}
 
int main()
{
    cin >> a >> b >> c;
    z = b*b-4*a*c;
    if(z>0)
        func1();
    else if(z=0)
        func2(); 
    else
    {
        func3();
        return 0; 
    }               
    printf("x1 = %.3f x2 = %.3f\n", x1, x2);
    return 0;
}

1030: [编程入门]二维数组的转置

题目:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。

代码如下(C):

#include<stdio.h>

int main()
{
    int a[3][3],i,j;
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            printf("%d ",a[j][i]);
        }
        printf("\n");
    }
    return 0;
}

代码如下(C++):

#include<iostream>
using namespace std;

int transform(int a[3][3]);//声明函数

int main()
{
    int a[3][3];
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        cin>>a[i][j];
    }
    transform(a);
    return 0;
}
 
int transform(int a[3][3])//自定义数组转置的函数
{
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        cout<<a[j][i]<<" ";
        cout<<endl;
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值