1.弹球距离
两种方法,一种用while循环,一种用函数递归,两种方法各有优势
首先第一种方法while循环
double dist(double h, double p) { double sum = h; double x=p*h; while (x >= TOL) { sum += x * 2; x *= p; } return sum; }
这个方法比较好理解,但要注意的是循环要从h*p开始,或者用dowhile也行
第二种是函数递归
double dist(double h, double p) { double sum = 0; double x=p*h; if(x<TOL) return h; else return h+dist(x,p)+x; }
代码比较简洁但并不容易理解,首先函数递归要有一个限制条件,且想办法然函数中的某个形参无限逼近与该条件,由题目可知,这个限制条件是让h*p^n逼近与0.001即可,当h*p^n满足小于0.001时返回h*p^(n-1),然后再往前推直到求到第一个dist函数,需要注意的是每次x与h的关系,第一次x=h*p,第二次传递x=h1*p,这时的h1由于第一次赋值等于h*p...然后一直往后递推直到x<0.001后返回,假设h*p^3<0.001,这时返回h*p^2,由于h*p^2>0.001,返回h+h*p^2+h*p^2...直到返回到第一次调用的dist函数即可。
2.
#include <stdio.h> int main() { int a, b, sum1=0, sum2=0, j; scanf("%d %d", &a, &b); for (int i = a; i <= b; i++) { for (j = 2; j < i; j++) { if (i % j == 0) break; } if (j == i) { sum1++; sum2 += i; } } printf("%d %d", sum1, sum2); return 0; }
这道题首先求哪个数是素数,素数的概念一个数的因子只有1和它本身,1除外。
所以由概念可知,假设一个数为x,当你用for循环遍历从2到x-1的数时,如果找到中间的某个数能被x整除,则说明它的因子不只有1和它本身,x为合数,这时结束求因子的for循环。而如果遍历所有这个范围的数都没找到,则说明x为素数,而条件j==i,则是为了说明你跳出循环是因为所有数都遍历完了,而不是因为找到另一个因子。
3.最大公约数最小公倍数
#include <stdio.h> int main() { int a,b,x,y; scanf("%d %d",&a,&b); x=a;y=b; while(a!=b) { if(a>b) a=a-b; else b=b-a; } printf("%d %d",a,(x/a)*(y/a)*a); return 0; }
先求最大公约数,方法有很多,例如辗转相除,更相减损
我这里用的是更相减损法,原理就是当a与b两个数不相等是将两数相减并赋值给较大的数,当减到两数相同时,这时两数的值即为它们的最大公约数,而最小公倍数就简单多了,用a,b两数除以最大公约数后相乘再乘上个最大公约数就能得到最小公倍数啦。
3.求整数的位数及各位数字之和
还是讲两种方法,一种while循环,一种函数递归(递归就不细讲了,参照第一题,因为讲起来有点绕,后面专门出一期函数递归讲讲里面的典型例题)
#include <stdio.h> int main() { int a,n,sum=0,x; scanf("%d",&a); x=a; while(a!=0) { x=a%10; n++; sum+=x; a=a/10; } printf("%d %d",n,sum); return 0; }
这种就是我们常说的模10法,接下来我以123为例讲一下
首先从位数入手,第一次循环123/10=12,第二次12/10=1,第三次1/10=0...由此可知,当跳出循环时,循环的次数等于该整数的位数
再说各个位上的数字,第一次循环123%10=3,第二次12%10=2,第三次1%10=1...这道题只用求和,所以不需要考虑求出各个位上的数字的顺序,如果题目要求正向输出各个位上的数字,就在while中把各个位上的数字赋给一个数组,然后用for循环倒着遍历即可
还有一种方法函数递归,省去了for循环,直接正序输出
int Print(int n)//定义函数,并传入形参n { if (n < 10) return printf("%d ", n); else { Print(n / 10); return printf("%d ", n % 10);; } } int main() { int n; scanf("%d", &n); Print(n); return 0; }
4.九九乘法表,基础题,就不细讲了
#include <stdio.h> int main() { int n; scanf("%d",&n); for (int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { printf("%d*%d=%-4d",j,i,i*j); } printf("\n"); } return 0; }