本周简单的学习了2个方法(辗转相除法)和(牛顿迭代法)
这2个方法用处比较局限,只能解决固定类型题。
问题1(辗转相除法)
判断两个整数m和n是否互质(即是否有公共的因子)(m≠1,n≠1)。方法是: 用2到t(t取m和n中较小的那个数)之间的数分别去除m和n,若m和n能同时被某个数除尽,则m和n不互质;否则它们互质。
例如,若输入187和85,则应输出No(表示它们不互质,它们有公因子17)。若输入89和187,则应输出Yes(表示它们互质)。
分析
先介绍一下辗转相除法:
即m 和 n求最大公因数(假设m大于n),先用 m 除以 n ,如果余数 r 为 0 ,则 n 就是最大公因数,否则,将 n 给了 m ,将 r 给了 n ,再用 m 除以 n ,如果余数 r 为 0 ,则n为最大公因数,否则重复执行上述操作,直至 r 为 0 ,此时的 n 就是 m 和 n 的最大公因数。
如m=72,n=48 .m%n=24;然后m=n=48;n=该余数24,48%24=0;所以最大公因数就是n=24.
#include<stdio.h>
int fun(int m,int n)
{
int t;
while(t=m%n)
{
m=n;
n=t;
}
return n;
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
int t;
t=fun(m,n);
if(t==1)
printf("yes");//互质则t=1;
else printf("no");//不互质则t!=1;
return 0;
}
总结:极大的减少了代码思路,一开始我想的循环,然后了解该方法后发现甚妙!
问题 2
用牛顿迭代法求根。方程为,系数a,b,c,d的值由主函数输入,分别为1,2,3,4。求x在1附近的一个实根。求出根后由主函数输出。
分析
一开始非常迷茫,不知道如何下手,如何去了解了一下牛顿迭代法,刹时豁然开朗。
这里介绍一下(牛顿迭代法)
牛顿迭代法是取x0之后,在这个基础上,找到比x更接近方程的根,一步一步迭代,从而找到更接近方程根的近似跟。具体思路看数学求根。公式为x=x0-f(x0)/f'(x0).迭代到|x-x0|<=要求即可
#include<stdio.h>
#include<math.h>
float solut(int a, int b, int c, int d)
{
float x = 1, x0, f, f1;
do
{
x0 = x;
f = ((a * x0 + b) * x0 + c) * x0 + d;
f1 = (3 * a * x0 + 2 * b) * x0 + c;
x = x0 - f / f1;
} while (fabs(x - x0) >= 1e-3);
return(x);
}
int main()
{
int a, b, c, d;
printf("input a,b,c,d:");
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("x=%10.7f\n", solut(a, b, c, d));
return 0;
}
总结
一种方法需要掌握,但是用处局限。这里用了fabs()绝对值,所以头文件要加math。这题主要还是公式的掌握,比较死板。
反思
自己掌握的方法太少了,下一周要多多学习方法!