题目链接
Given an integer nn, we only want to know the sum of1/k^2
where k from 1 to n.
Input Format
There are multiple cases.
For each test case, there is a single line, containing a single positive integer n.
The input file is at most 1M.
Output Format
The required sum, rounded to the fifth digits after the decimal point.
样例输入
1
2
4
8
15
样例输出
1.00000
1.25000
1.42361
1.52742
1.58044
题目来源
ACM-ICPC 2016 Qingdao Preliminary Contest
第一种代码:
#include<iostream>
#include<cstdio>
using namespace std;
string s;
int n,flag;
double sum[120005];
void init(){//先进行打表
for(int i = 1;i <= 120000;i++)
sum[i] = sum[i - 1] + 1.0 / i / i;//1.0 / (i * i)的话,int 类型必须改成long long 类型
return;
}
int main(){
init();
while(cin >> s){
n = 0,flag = 0;
for(int i = 0;i < s.size();i++){
n = n * 10 + s[i] - '0';
//n += (s[i] - '0') * pow(10,s.size() - i - 1);计算n会越界,如果s.size() = 100、1000 等等,
//10 ^100?
if(n > 120000){
flag = 1;
break;
}
}
if(flag)//超过120000就是固定值
printf("1.64493\n");
else
printf("%.5lf\n",sum[n]);
}
return 0;
}
第二种代码:
#include<iostream>
#include<sstream>
#include<cstdio>
using namespace std;
int n;
string s;
double sum[1000005];
void init(){
for(int i = 1;i <= 999999;i++)
sum[i] = sum[i - 1] + 1.0 / i / i;
return;
}
int main(){
init();
while(cin >> s){
if(s.size() <= 6){
stringstream x;//字符串流,直接将string类型转化成int类型
x << s;
x >> n;
printf("%.5lf\n",sum[n]);
}
else
printf("1.64493\n");
}
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char s[1200005];//数组一定要开的足够大,否则时间超时,100000不行,具体可以自己去试试
double sum[1000005];
long long int n,arr[1000005];
int main(){
for(long long int i = 1;i <= 1000000;i++){
arr[i] = i * i;
sum[i] = sum[i - 1] + 1.0 / arr[i];
}
while(~scanf("%s",s)){
n = 0;
if(strlen(s) <= 6){
for(int i = 0;i < strlen(s);i++)
n += (s[i] - '0') * pow(10,strlen(s) - i - 1);
printf("%.5lf\n",sum[n]);
}
else
printf("1.64493\n");
}
return 0;
}