最大最小公倍数
题目:
问题描述
已知一个正整数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。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:第一行是一个整数N,N £ 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循环,超时了