编程打卡:C语言趣味编程习题做
4.15 编程打卡 C 语言趣味编程
牛顿迭代法求解方程根
问题描述
用牛顿迭代法求解方程根的函数,方程为:\(ax^3+bx^2+cx+d=0\),系数 a,b,c,d 由主函数输入,求x在1附近的一个实根。求出根后输出。
牛顿迭代法的公式是:\(x=x_0-\frac{f(x_0)}{f^{'}(x_0)}\),设迭代倒\(|x-x_0|\leq10^-5\)时结束。
设计思路
循环运算,直至 \(|x-x_0|\leq10^-5\) 退出循环,输出结果。
对函数求导 \(f^{'}(x)=3ax^2+2bx+c\) 。
流程图
#include <iostream>
#include <cmath>
using namespace std;
double solve (double a,double b,double c,double d)
{
double x = 1.5,x0,minn = 10000;
do {
x0 = x;
x = x0 - (a * x0 * x0 * x0 + b * x0 * x0 + c * x0 + d)/(3 * a * x0 * x0 + 2 * b * x0 + c);
} while (fabs(x - x0) >= 1e-5);
return x;
}
int main () {
double a,b,c,d;
cin >> a >> b >> c >> d;
cout << solve(a,b,c,d);
}
运行结果
输入
2 -4 3 -6
输出
2
冒泡排序
问题描述
对N个数进行升序排列
设计思路
遍历数组,若相邻两个数组前大于后,就将它们交换,因为每次都把大的数字移动到相对后面,可以发现,最后一个数的位置已经确定,然后只需要遍历前面的N-1个数即可。
流程图
代码实现
#include <iostream>
using namespace std;
const int N = 10;
int a[N] = {5,4,8,7,2,9,1,3,6,0};
int main ()
{
for (int i = 0; i < N - 1; i ++) {
for (int j = 0; j < N - i - 1; j ++) {
if (a[j] > a[j + 1])
swap(a[j],a[j+1]);
}
}
for (int i : a)
cout << i << " ";
}
运行结果
0 1 2 3 4 5 6 7 8 9
折半查找
问题描述
二分
设计思路
二分查找
流程图
代码实现
#include <iostream>
using namespace std;
const int N = 15;
int a[N] = {1,2,3,8,8,8,8,8,8,10,11,12,13,16,19};
int main () {
int l,r,n;
n = 10;
l = 0,r = 14;
while (l < r)
{
int mid = l + r >> 1;
if (a[mid]>=n) r = mid; // check()判断mid是否满足性质
else l = mid + 1;
}
if (a[l] == n) cout << n << endl;
else cout << "not found";
n = 15;
l = 0,r = 14;
while (l < r)
{
int mid = l + r >> 1;
if (a[mid]>=n) r = mid; // check()判断mid是否满足性质
else l = mid + 1;
}
if (a[l] == n) cout << n << endl;
else cout << "not found";
}
运行结果
10
not found