等差数列

题目 100

描述

功能:等差数列 2,5,8,11,14。。。。
输入:正整数N >0
输出:求等差数列前N项和
返回:转换成功返回 0 ,非法输入与异常返回-1

输入

输入一个正整数。

输出

输出一个相加后的整数。

样例输入

2

样例输出

7

思路

由于等差数列  d=3  已经给出了,直接可以根据公式来算
Sn=s0+sn2×N=2+[2+(N1)×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

思路

  1. 找素数
  2. 算差值
  3. 遍历查找

代码

#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;
}

到处都是坑,加油!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值