题目 100
描述
功能:等差数列 2,5,8,11,14。。。。
输入:正整数N >0
输出:求等差数列前N项和
返回:转换成功返回 0 ,非法输入与异常返回-1
输入
输入一个正整数。
输出
输出一个相加后的整数。
样例输入
2
样例输出
7
思路
由于等差数列
d=3
已经给出了,直接可以根据公式来算
Sn=s0+sn2×N=2+[2+(N−1)×d]2×N
代码
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
if(N>0)
{
cout<<N*2+N*(N-1)*3/2<<endl;
}
else
{
return -1;
}
return 0;
}
题目 100
描述
题目标题:
在给定的区间范围内找出所有素数能构成的最大的等差数列(即等差数列包含的素数个数最多)。
详细描述:
接口说明
原型:
public static int[] GetMaxArray( int m, int n)
输入参数:
int m 给定的区间下限
int n 给定的区间上限
返回值:
等差数列
限制:
0 <= m<= n
举例:
在区间[0, 10]中,素数构成的最大等差数列为3,5,7
输入
先后输入两个int数,表示下限和上限
输出
在给定的区间范围内找出所有素数能构成的最大的等差数列
样例输入
0 30
样例输出
5
11
17
23
29
思路
- 找素数
- 算差值
- 遍历查找
代码
#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
bool Isprime(int n)
{
int flag=1;
if (n<2)
{
return false;
}
if (n==2)
{
return true;
}
for (int i=2; i<=sqrt((double)n); i++)
{
if (n%i==0)
{
flag=0;
break;
}
}
//判断素数
if (flag)
{
return true;
}
else
{
return false;
}
}
bool find(int m,int a[],int n)
{
int flag=0;
for (int i=0; i<n; i++)
{
if (m==a[i])
{
flag=1;
}
}
if (flag)
{
return true;
}
else
{
return false;
}
}
int main()
{
int minNum,maxNum,a[1000],k=0,len=1,endNum,dk=0;
vector<int> d;//保存差值
cin>>minNum>>maxNum;
for (int i=minNum; i<=maxNum; i++)
{
if (Isprime(i))
{
a[k++]=i; //所有的素数存起来
}
}
//保存差值
for (int i=0; i<k; i++)
{
for(int j=i+1; j<k; j++)
{
d.push_back(a[j]-a[i]);
}
}
sort(d.begin(),d.end());
vector<int>::iterator it=unique(d.begin(),d.end());
d.erase(it,d.end()); //所有的不重复的公差存起来
for (int i=0; i<k; ++i)
for (int j=0; j< d.size(); ++j)
{
int tmp=d[j], counter=1;
while (find((a[i]+tmp),a,k))
{
counter++;
tmp+=d[j];
}
//找最长的序列并且等差时差值最大的!!!!
if (counter>len||(counter==len &&d[j]>dk))//||(counter==len &&d[j]>dk))
{
len=counter;
endNum=a[i];
dk=d[j];
}
counter=1;
}
for (int i=0; i<len; i++)
{
cout<<endNum<<endl;//以回车来分隔
endNum+=dk;
}
return 0;
}
题目 200
题目标题:
在给定的区间范围内找出所有素数能构成的最大的等差数列(即等差数列包含的素数个数最多)。
详细描述:
接口说明
原型:
int GetMaxArray(unsignedint m, unsignedint n, unsignedint *pArrayNum , unsignedint *pArray)
输入参数:
unsigned int m 给定的区间下限
unsigned int n 给定的区间上限
输出参数:
unsigned int *pArrayNum 等差数列中数字的个数
unsigned int *pArray 等差数列
返回值:
int 0:处理成功 -1:出现异常
限制:
0 <= m
m
输入
输入两个正整数
输出
输出一个等差数列
样例输入
1 10
样例输出
3 5 7
思路
输出空格分隔,等差时选最小的
代码
#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
bool Isprime(int n)
{
int flag=1;
if (n<2)
{
return false;
}
if (n==2)
{
return true;
}
for (int i=2; i<=sqrt((double)n); i++)
{
if (n%i==0)
{
flag=0;
break;
}
}
//判断素数
if (flag)
{
return true;
}
else
{
return false;
}
}
bool find(int m,int a[],int n)
{
int flag=0;
for (int i=0; i<n; i++)
{
if (m==a[i])
{
flag=1;
}
}
if (flag)
{
return true;
}
else
{
return false;
}
}
int main()
{
int minNum,maxNum,a[1000],k=0,len=1,endNum,dk=0;
vector<int> d;//保存差值
cin>>minNum>>maxNum;
for (int i=minNum; i<=maxNum; i++)
{
if (Isprime(i))
{
a[k++]=i; //所有的素数存起来
}
}
//保存差值
for (int i=0; i<k; i++)
{
for(int j=i+1; j<k; j++)
{
d.push_back(a[j]-a[i]);
}
}
sort(d.begin(),d.end());
vector<int>::iterator it=unique(d.begin(),d.end());
d.erase(it,d.end()); //所有的不重复的公差存起来
for (int i=0; i<k; ++i)
for (int j=0; j < (int)d.size(); ++j)
{
int tmp=d[j], counter=1;
while (find((a[i]+tmp),a,k))
{
counter++;
tmp+=d[j];
}
//找最长的序列
if (counter>len)
{
len=counter;
endNum=a[i];
dk=d[j];
}
counter=1;
}
for (int i=0; i<len; i++)
{
cout<<endNum;
if(i==len-1)//空格分隔
{
cout<<endl;
}
else
{
cout<<" ";
}
endNum+=dk;
}
return 0;
}
到处都是坑,加油!