程序设计实训8月18日小组编程
7-1 近似求PI
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
输入格式:
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
//%le用于输入(出)科学计数法
输出格式:
在一行内,按照以下格式输出π的近似值(保留小数点后5位):
PI = 近似值
输入样例:
1E-5
输出样例:
PI = 3.14158
ssn:我开始的错误思想是吧分子分母分割开来,写个阶乘的函数求分子,分母写一个从3开始+=2的累乘的函数,然后过了两个测试点剩下的超时了。其实只要发现相加的新的一项是老一项×i/(2×i+1),问题就非常简单了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i;
double eps,paiban=1,xiang=1;
scanf("%le",&eps);
for(i=1;xiang>eps;i++){
xiang *= i*1.0/(2*i+1);
paiban += xiang;
}
printf("PI = %.5f",paiban*2);
return 0;
}
7-2 数列求和-加强版
给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
输入样例:
1 3
输出样例:
123
ssn:这道题我有印象写过:特殊a串数列求和。但直接套用不行,因为sum值过大越界了,改成long long还是不可。得用数组解决。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int s[100001]={0};//这里几个零一定要数对,我之前就是少输一个半天改不对
int i,j,a,n,tp;
cin>>a>>n;
//想想n个数排成一个大竖式做加法
for(i=0,j=n;i<n;j--,i++){
tp = s[i]+j*a;
s[i] = tp%10;
if(tp/10!=0){
s[i+1] += tp/10;
}
}
if(s[n]>0){
n++;
}
if(n==0){
printf("0");
}
else{
for(i=n-1;i>=0;i--){
printf("%d",s[i]);
}
}
return 0;
}