【7-2多项式求和】
输入格式:
第一行为一个整数n和一个浮点数x0。其中0≤n≤30,000,表示多项式次数;x0为多项式中的变量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;
}