数据结构PTA实验一算法的复杂度

【7-2多项式求和】

输入格式:
第一行为一个整数n和一个浮点数x​0​​。其中0≤n≤30,000,表示多项式次数x​0为多项式中的变量x的取值。 第二行为空格分割的n+1个浮点数,由高到低表示多项式中项的系数。可以假设输入总是合法的。

输出格式:
输出多项式的求值结果,保留三位小数,以换行结尾。

输入样例:

3 1.0
1 2 3 4

在这里插入图片描述

 输出样例:

10.000

C++

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int n;
    double m;
    double a[3000];//记录每一项的系数
    while(cin>>n>>m)//设置多组输入
    {
        double fx=0,x0=0;//fx是多项式的值,x0是每一项的值
        for(int i=n;i>=0;i--)//这里逆序循环,方便项与项的乘积和加上最后一项
            cin>>a[i];//输入系数
        for(int i=n;i>0;i--)
        {
        x0=a[i]*pow(m,i);
        fx+=x0;
        }
        printf("%.3lf\n",fx+a[0]);
    }
    return 0;
}

【7-3快速幂运算】

编程求x^y最后三位数表示的整数

输入格式:

输入在一行中给出两个整数x和y,其中1<=x,y<=1000000000

输出格式:

输出占一行,是x^y的最后三位表示的整数。

输入样例1:

2 3

输出样例1:

8

输入样例2:

12  6

输出样例2:

984

算法分析:

当我们计算的数字是三位以内(包含三位)的话,就输出当前的数字,当结果超过三位,我们就输出该数字的后三位。由y的数据范围我们可以看出,需要计算很大的数,所以我们一般的数据范围是无法存储的,而且一般的计算方法也是超时的,所以我们需要使用分治法,因为幂运算可以分成两个相等的数相乘获得,再结合递归可以实现。数据的溢出,我们需要利用取余的手段,我们每次都对递归出的结果进行1000取余,一直都对后三位进行运算

c++

#include<bits/stdc++.h>
using namespace std;
int quickpow(int a,int b){
    if(b==1)
    {
    return a;
    }
    else
    {
        int c=quickpow(a,b/2);
        if(b%2==0)
        {
            int m=c*c%1000;
            return m;
        }
        else
        {
            int n=c*c*a%1000;
            return n;
        }
    }
}
int main(){
    int a=0,b=0;
    cin>>a>>b;
    int m=quickpow(a,b);
    int c[3];
    for(int i=2;i>=0;i--)
    {
        c[i]=m%10;
        m/=10;
    }
    int sum=0;
    sum+=c[0]*10*10+c[1]*10+c[2];
    cout<<sum;
    return 0;
}

【7-4求素数个数】

求1~n的素数个数。 要求至少给出两种解法,对于相同的n,给出这两种解法的结果,通过相关数据进行测试,目的是通过对比同一问题不同解法的绝对执行时间体会如何设计“好”的算法

输入格式:

输入在一行中给出1个整数n(<= 10 000 000)。

输出格式:

对每一组输入,在一行中输出1~n的素数个数

输入样例:

5

输出样例:

3

C++

#include <iostream>
#include <math.h>
#define N 10000000+5
using namespace std;
bool nums[N];
int main()
{	
	int i,j,n,s,re=0;
	cin>>n;
	s=(int)sqrt(n)+1;
	for(i=2;i<=n;i++)
	   nums[i]=true;
    for(i=2;i<=s;i++)
    {   if(nums[i])
        {
        	for(j=i*i;j<=n;j=j+i)
               nums[j]=0;  
        }
    }
    for(i=2;i<=n;i++)
        	re=re+nums[i];
    cout<<re;  
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值