ZZNUOJ(C/C++)基础练习1051——1060(详解版)
1051 : 求数列的和
题目描述
数列的定义如下:
数列的第一项为item,以后各项为前一项的平方根,求数列的前n项的和。输入
由两个整数item(item<10000)和n(n<1000)组成,item和n的含义如前所述。
输出
输出该数列的和,占一行,要求精度保留2位小数。
样例输入
84 4样例输出
97.93
C语言版
#include<stdio.h> // 包含标准输入输出库
#include<math.h> // 包含数学函数库,用于调用 sqrt 函数
int main()
{
int item, n, i; // 定义变量:item 为初始值,n 为迭代次数,i 为循环计数器
double mid, sumN = 0; // 定义变量:mid 用于存储当前值,sumN 用于存储累加和,初始化为 0
// 从用户输入中读取初始值 item 和迭代次数 n
scanf("%d%d", &item, &n);
// 将初始值赋值给 mid,作为第一次迭代的起始值
mid = item;
// 循环 n 次,计算平方根序列的和
for (i = 0; i < n; i++)
{
// 将当前 mid 的值累加到 sumN 中
sumN += mid;
// 更新 mid 为当前 mid 的平方根
mid = sqrt(mid);
}
// 输出最终的累加和,保留两位小数
printf("%.2f\n", sumN);
return 0; // 程序正常结束
}
C++版
#include<iostream> // 包含标准输入输出流库
#include<cmath> // 包含数学函数库,用于调用 sqrt 函数
#include<iomanip> // 包含输入输出格式控制库,用于设置输出格式
using namespace std; // 使用标准命名空间,避免重复书写 std::
// 定义一个宏 av(y),用于设置输出精度为 y 位小数,并固定小数点
#define av(y) setprecision(y) << fixed
int main()
{
int item, n, i; // 定义变量:item 为初始值,n 为迭代次数,i 为循环计数器
double mid, sumN = 0; // 定义变量:mid 用于存储当前值,sumN 用于存储累加和,初始化为 0
// 从标准输入读取初始值 item 和迭代次数 n
cin >> item >> n;
// 将初始值 item 赋值给 mid,作为第一次迭代的起始值
mid = item;
// 循环 n 次,计算平方根序列的和
for (i = 0; i < n; i++)
{
// 将当前 mid 的值累加到 sumN 中
sumN += mid;
// 更新 mid 为当前 mid 的平方根
mid = sqrt(mid);
}
// 输出最终的累加和,保留两位小数
cout << av(2) << sumN << endl;
return 0; // 程序正常结束
}
1052 : 前n项和
题目描述
输入n和a,求a+aa+aaa+…aa…a(n个a),如当n=3,a=2时,2+22+222的结果为246
输入
包含两个整数,n和a,含义如上述,你可以假定n和a都是小于10的非负整数
输出
输出前n项和,单独占一行
样例输入
3 2样例输出
246注意:前n项和对应的变量,用整形
C++版
#include<iostream> // 包含标准输入输出流库
using namespace std; // 使用标准命名空间,避免重复书写 std::
int main()
{
int a, n, i; // 定义变量:a 为初始值,n 为迭代次数,i 为循环计数器
int mid, sumN = 0; // 定义变量:mid 用于存储当前值,sumN 用于存储累加和,初始化为 0
// 从标准输入读取迭代次数 n 和初始值 a
cin >> n >> a;
// 将初始值 a 赋值给 mid,作为第一次迭代的起始值
mid = a;
// 循环 n 次,生成数列并计算和
for (i = 0; i < n; i++)
{
// 将当前 mid 的值累加到 sumN 中
sumN += mid;
// 更新 mid 为当前 mid 的末尾追加一个 a
mid = mid * 10 + a;
}
// 输出最终的累加和
cout << sumN << endl;
return 0; // 程序正常结束
}
C语言版
#include<stdio.h> // 包含标准输入输出库
int main()
{
int a, n, i; // 定义变量:a 为初始值,n 为迭代次数,i 为循环计数器
int mid, sumN = 0; // 定义变量:mid 用于存储当前值,sumN 用于存储累加和,初始化为 0
// 从标准输入读取迭代次数 n 和初始值 a
scanf("%d%d", &n, &a);
// 将初始值 a 赋值给 mid,作为第一次迭代的起始值
mid = a;
// 循环 n 次,生成数列并计算和
for (i = 0; i < n; i++)
{
// 将当前 mid 的值累加到 sumN 中
sumN += mid;
// 更新 mid 为当前 mid 的末尾追加一个 a
mid = mid * 10 + a;
}
// 输出最终的累加和
printf("%d\n", sumN);
return 0; // 程序正常结束
}
1053 : 正弦函数
题目描述
输入x,计算上面公式的前10项和。
输入
输入一个实数x。(0<=x<=3)
输出
输出一个实数,即数列的前10项和,结果保留3位小数。
样例输入
1样例输出
0.841
C语言版(递归+记忆化数组)代码没有问题,太高级了OJ上过不了,可借鉴思路
#include<stdio.h>
#include<math.h>
int mem[20]={0};
int factrial(int x)
{
if(mem[x]) return mem[x];
int mid=0;
if( x == 1 || x==0)
{
return 1;
}
else
{
mid = x * factrial(x-1);
}
mem[x]=mid;
return mid;
}
int main()
{
double mid,sumN=0,x,i;
scanf("%lf",&x);
mid = x;
for(i=1;i<=10;i++)
{
sumN += mid/factrial(2*i-1);
mid = mid*x*x*(-1);
}
printf("%.3f\n",sumN);
return 0;
}
代码二(通过OJ)
#include<stdio.h> // 包含标准输入输出库
int main()
{
double mid1, sumN = 0, x, i; // 定义变量:mid1 用于存储当前项的分子,sumN 用于存储级数和,x 为输入值,i 为循环计数器
long long mid2; // 定义变量:mid2 用于存储当前项的分母,使用 long long 类型以避免溢出
scanf("%lf", &x); // 从标准输入读取一个双精度浮点数 x
mid1 = x; // 将 x 赋值给 mid1
mid2 = 1; // 将 1 赋值给 mid2
for (i = 1; i <= 10; i++)
{
sumN += mid1 / mid2; // 计算级数的每一项并累加到 sumN 中
mid1 = mid1 * x * x * (-1); // 更新 mid1 为下一项的分子
mid2 = mid2 * (2 * i) * (2 * i + 1); // 更新 mid2 为下一项的分母
}
printf("%.3f\n", sumN); // 输出最终的级数和,保留三位小数
return 0; // 程序正常结束
}
C++版
#include<iostream> // 包含标准输入输出流库
#include<iomanip> // 包含输入输出格式控制库,用于设置输出格式
using namespace std; // 使用标准命名空间,避免重复书写 std::
// 定义一个宏 av(y),用于设置输出精度为 y 位小数,并固定小数点
#define av(y) setprecision(y) << fixed
int main()
{
double mid1, sumN = 0, x, i; // 定义变量:mid1 用于存储当前项的分子,sumN 用于存储级数和,x 为输入值,i 为循环计数器
long long mid2; // 定义变量:mid2 用于存储当前项的分母,使用 long long 类型以避免溢出
cin >> x; // 从标准输入读取一个双精度浮点数 x
mid1 = x; // 将 x 赋值给 mid1
mid2 = 1; // 将 1 赋值给 mid2
for (i = 1; i <= 10; i++)
{
sumN += mid1 / mid2; // 计算级数的每一项并累加到 sumN 中
mid1 = mid1 * x * x * (-1); // 更新 mid1 为下一项的分子
mid2 = mid2 * (2 * i) * (2 * i + 1); // 更新 mid2 为下一项的分母
}
cout << av(3) << sumN << endl; // 输出最终的级数和,保留三位小数
return 0; // 程序正常结束
}
1054 : 猴子吃桃
题目描述
悟空第一天摘下桃子若干,当即吃掉一半,还不过瘾,又多吃一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
输入
输入一个数n(1<=n<=30)。
输出
输出第一天的桃子个数。
样例输入
3
样例输出
10
C语言版
#include<stdio.h> // 包含标准输入输出库
#include<math.h> // 包含数学函数库(虽然本代码中未使用数学函数库的功能)
int main()
{
int n, mid = 1, i; // 定义变量:n 为天数,mid 为当前桃子数量,i 为循环计数器
scanf("%d", &n); // 从标准输入读取一个整数 n
// 从 2 开始循环到 n,共循环 n-1 次
for (i = 2; i <= n; i++)
{
mid = (mid + 1) * 2; // 每次将当前值 mid 加 1 后再乘以 2
}
printf("%d\n", mid); // 输出最终的 mid 值
return 0; // 程序正常结束
}
C语言(递归)
#include<stdio.h> // 包含标准输入输出库
// 定义递归函数 dfs,用于计算第 x 天的桃子数量
int dfs(int x)
{
int sum = 0; // 定义变量 sum 用于存储计算结果
if (x == 1) return 1; // 如果是第 1 天,返回 1(因为第 1 天只剩下一个桃子)
else
{
// 递归计算前一天的桃子数量
// 根据题目描述,第 x 天的桃子数量是第 x-1 天的桃子数量加 1 后再乘以 2
sum = (dfs(x - 1) + 1) * 2;
}
return sum; // 返回计算结果
}
int main()
{
int n, mid, i; // 定义变量:n 为天数,mid 为最终结果,i 为循环计数器(虽然本代码中未使用 i)
scanf("%d", &n); // 从标准输入读取一个整数 n
mid = dfs(n); // 调用递归函数 dfs 计算第 n 天的桃子数量
printf("%d\n", mid); // 输出最终的桃子数量
return 0; // 程序正常结束
}
C++版
#include<iostream> // 包含标准输入输出流库
using namespace std; // 使用标准命名空间,避免重复书写 std::
int main()
{
int n, mid = 1, i; // 定义变量:n 为输入的整数,mid 为1,第一天桃子数为一,i 为循环计数器
cin >> n; // 从标准输入读取一个整数 n
// 从 2 开始循环到 n,共循环 n-1 次
for (i = 2; i <= n; i++)
{
mid = (mid + 1) * 2; // 每次将当前值 mid 加 1 后再乘以 2
}
printf("%d\n", mid); // 输出最终的 mid 值,即第n天桃子的数
return 0; // 程序正常结束
}
1055 : 兔子繁殖问题
题目描述
这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?
输入
输入月数n(1<=n<=44)。
输出
输出第n个月有多少对兔子。
样例输入
3
样例输出
2
C语言版 (递归)
#include<stdio.h>
#include<math.h>
// 定义递归函数 dfs,用于计算第 n 个月的兔子对数
int dfs(int x)
{
int sum = 0; // 定义变量 sum 用于存储计算结果
if (x == 1 || x == 2) return 1; // 第 1 个月和第 2 个月都只有 1 对兔子
else
{
// 递归计算第 n 个月的兔子对数
// 根据斐波那契数列的定义,第 n 个月的兔子对数等于第 n-1 个月和第 n-2 个月的兔子对数之和
sum = dfs(x - 1) + dfs(x - 2);
}
return sum; // 返回计算结果
}
int main()
{
int n, mid, i; // 定义变量:n 为月份数,mid 为最终结果,i 为循环计数器(虽然本代码中未使用 i)
scanf("%d", &n); // 从标准输入读取一个整数 n,表示需要计算的月份
mid = dfs(n); // 调用递归函数 dfs 计算第 n 个月的兔子对数
printf("%d\n", mid); // 输出最终的结果
return 0; // 程序正常结束
}
(动态规划)
#include<stdio.h> // 包含标准输入输出库
int main()
{
int n, mid, i; // 定义变量:n 为月份数,mid 为中间变量(未使用),i 为循环计数器
scanf("%d", &n); // 从标准输入读取一个整数 n,表示需要计算的月份
int f[n + 1]; // 定义一个数组 f,用于存储斐波那契数列的每一项,大小为 n+1
f[1] = 1; // 第 1 个月有 1 对兔子
f[2] = 1; // 第 2 个月也有 1 对兔子
// 使用循环计算从第 3 个月到第 n 个月的兔子对数
for (i = 3; i <= n; i++)
{
f[i] = f[i - 1] + f[i - 2]; // 第 i 个月的兔子对数等于第 i-1 个月和第 i-2 个月的兔子对数之和
}
printf("%d\n", f[n]); // 输出第 n 个月的兔子对数
return 0; // 程序正常结束
}
C++版
动态规划
#include<iostream> // 包含标准输入输出流库
using namespace std; // 使用标准命名空间,避免重复书写 std::
int main()
{
int n, i; // 定义变量:n 为月份数,i 为循环计数器
cin >> n; // 从标准输入读取一个整数 n,表示需要计算的月份
int f[n + 1]; // 定义一个数组 f,用于存储斐波那契数列的每一项,大小为 n+1
f[1] = 1; // 第 1 个月有 1 对兔子
f[2] = 1; // 第 2 个月也有 1 对兔子
// 使用循环计算从第 3 个月到第 n 个月的兔子对数
for (i = 3; i <= n; i++)
{
f[i] = f[i - 1] + f[i - 2]; // 第 i 个月的兔子对数等于第 i-1 个月和第 i-2 个月的兔子对数之和
}
cout << f[n] << endl; // 输出第 n 个月的兔子对数
return 0; // 程序正常结束
}
递归
#include<iostream> // 包含标准输入输出流库
using namespace std; // 使用标准命名空间,避免重复书写 std::
// 定义递归函数 dfs,用于计算斐波那契数列的第 x 项
int dfs(int x)
{
int sum = 0; // 定义变量 sum 用于存储计算结果
if (x == 1 || x == 2) return 1; // 第 1 项和第 2 项都是 1
else
{
// 递归计算第 x 项的值
// 根据斐波那契数列的定义,第 x 项是第 x-1 项和第 x-2 项的和
sum = dfs(x - 1) + dfs(x - 2);
}
return sum; // 返回计算结果
}
int main()
{
int n, i; // 定义变量:n 为月份数,mid 为最终结果
cin >> n; // 从标准输入读取一个整数 n,表示需要计算的月份
mid = dfs(n); // 调用递归函数 dfs 计算第 n 个月的兔子对数
cout << mid; // 输出第 n 个月的兔子对数
return 0; // 程序正常结束
}
1056 : 整存零取
题目描述
假设银行一年整存零取的月息为x,现在某人手头有一笔钱,他打算在今后5年中,每年年底取出1000元作为孩子来年的教育金,到第5年孩子毕业时刚好取完这笔钱,请编程计算第1年年初时他应存入银行多少钱。
输入
输入一个实数x,表示月息。
输出
输出一个实数,小数点后保留两位小数,占一行。
样例输入
0.01875
样例输出
2833.29