蓝桥算法训练 最大最小公倍数 出现次数最多的整数 图形显示

最大最小公倍数

题目:

问题描述

已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入格式

输入一个正整数N。

输出格式

输出一个整数,表示你找到的最小公倍数。

样例输入

9

样例输出

504

数据规模与约定

1 <= N <= 106。

题目分析:这题有坑,输入输出都要为long long型,否则判断结果为0分。

一般来说,最大的三个数是 n,n-1,n-2 这三个数,如果这三个数互质,那么一定符合题意。接下来讨论一下n分别为奇数和偶数的情况。

当n为奇数时,n(奇),n-1(偶),n-2(奇),两个奇数之间相差2,但两个奇数之间是不会存在公共因子2的,所以   最大最小公倍数=n*(n-1)*(n-2)。

当n为偶数时,n(偶),n-1(奇),n-2(偶),这里两个偶数之间一定有公共因子2,所以需要将n-2(偶)向后推一位,变为n-3(奇),即为 n(偶),n-1(奇),n-3(奇),这是要判断一下  n 与 n-3之间是否有公共因子3,若没有   最大最小公倍数=n*(n-1)*(n-3); 若有  最大最小公倍数=(n-1)*(n-2)*(n-3)。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{

    long long int n,sum;
    while(scanf("%lld",&n)!=EOF)
    {
      if(n%2)
         sum=n*(n-1)*(n-2);
     else
     {
          if(n%3)
            sum=(n-1)*n*(n-3);
          else 
           sum=(n-2)*(n-1)*(n-3);
     }
     printf("%lld\n",sum);
    }
    return 0;
}

 

 

出现次数最多的整数

题目:

问题描述
  编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
  输入格式:第一行是一个整数NN £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
  输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例

样例输入

5
100
150
150
200
250

样例输出

150

题目分析:

这里有一个坑   若 n<=0,就return 0   没有这种情况扣20分。

由题意可知,这组数据在输入时便是由小到大排好序的,所以用一个数组来储存这些数据,判断后一个数与前一个数是否相等,若相同,用一个临时变量保存一下次数,将次数+1;然后判断临时变量最大次数的大小,若大于最大次数,将值赋给最大次数,将a[i]值赋给一个int值b,最后输出int值b。(大于最大次数才更新b的值,这样解决了  “如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值”   这种情况。)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n,a[20],cnt;
    while(scanf("%d",&n)!=EOF)
    {
        if(n<=0)return 0;
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        int max1=1;//统计每个数出现的次数
        int sum=1;//记录最大次数
        int flag=a[0];//记录出现次数最多的数
        for(int i=1;i<n;i++)
        {
            if(a[i]!=a[i-1])
                max1=1;
            
            else
              max1++;
              
            if(sum < max1)
            {
                sum = max1;
                flag = a[i];
            }
        }
            cout<<flag<<endl;
    }
    return 0;
}

 

 

图形显示

题目:

问题描述

  编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数):
  * * * * *
  * * * *
  * * *
  * *
  *

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
       // while(n)
        for(int j=n;j>0;j--)
        {
          for(int i=j;i>0;i--)
            printf("* ");
          printf("\n");
          //n--;

        }
    }
    return 0;
}
用两层for循环来实现,第一次用的while循环,超时了

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值