gcd的使用:完成对1/1+1/2+1/3+…+1/n的和的算法编写

今天闲着无聊写了个算法,要完成的目的是:求出1/1+1/2+1/3+…+1/n的和。废话不多说,代码在这儿:

#include <stdc++.h>
using namespace std;
int a, b = 1, c = 1;
int d=1,e,g;
int gcd(int a,int b) {
  int f=0;
  while (b) {
    f = a%b;
    a = b;
    b = f;
  }
  return a;
}
int main() {
  int gcd(int, int);
  cin >> a ;
  for (int i = 1; i < a;++i) {
    d = d*(b + 1);//确定分母
    if (i > 1) {
      c = c*(b + 1) + e;
    }
    else c = c*(b + 1) + b;//确定分子
    e = d;
    ++b;		
  }
  g = gcd(c, d);
  c = c / g;
  d = d / g;
  printf("%d\n", c);
  printf("——\n");
  printf("%d", d);
  system("pause");
}

首先让我们来理清一下思路,平时我们在运算1/1+1/2+1/3时是不是先把它们的分母化成一样,怎么化呢?就是前一项的分母乘以后一项的分母,后一项的分母乘以前一项的分母,转换成代码就是:

d = d*(b + 1);//确定分母

因为我们永远是从1/1开始加的,所以第一项的分母一定是1,第二项的分母呢一定是前一项再加1,所以就是d*(b+1),然后将新的分母的值储存起来。

解决完分母再解决分子,分子较分母会困难一点,我们在运算的时候是不是前一项的分子乘以后一项的分母,后一项的分子乘以前一项的分母,那么代码就是:

if (i > 1) {
  c = c*(b + 1) + e;
}
else c = c*(b + 1) + b;//确定分子
e = d;

解决完分母分子后还有一件事我们要完成,那就是约分,约分就是找到他们的最大公因数,普遍的方法呢就是用碾转相除法,解释一下:如果要找出a,b的最大公因数,那么我们就只要先让a除以b,我们会得到一个余数,然后再让b除以余数,我们又会得到一个余数,接着让上一次得到的余数除以这一次得到的余数我们就又会得到一个余数,直到余数为0后我们最后得出来的值就是最大公约数,转换成代码就是:

int gcd(int a,int b) {
  int f=0;
  while (b) {
    f = a%b;
    a = b;
    b = f;
  }
  return a;
}

到这里我们算法就写完了,让我们随便来运行一下;

 

可以看到答案是正确的。

个人对于指针的理解

指针是c语言中比较重要的一块,接下来让我们来分析一下指针有什么用以及怎么用。

指针顾名思义就是指向某个东西,定义是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值,由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。举个例子,桌面上的快捷方式大家都用过吧,这个快捷方式大家就可以理解为一个指针,它指向了我们要打开的应用的地址。

介绍完怎么指针有什么用那么接下来将要将怎么用,在c语言中有一个符号,是“*”,也就是平时大家所说的星号,它表示的意思是指向某个变量。而声明指针的格式就是 type *var name,type就是c语言中的基本类型,如int,char等等,var name就是变量,大家可以随便取。声明完指针变量后就可以开始使用指针了,让我们来看看例子:

#include <stdc++.h>
using namespace std;
int main() {
  int *bian;//声明指针变量
  int jun = 1;
  bian = &jun;将jun的地址赋给变量
  printf("%d", *bian);//输出指针变量中的储存的值(不是地址)
  system("pause");
}

运行一下会得到一下结果:

可以看到输出的就是我们最先定义的变量jun的值。

可能有人看到这儿还是有点懵,那我们把程序稍微变一变:

#include <stdc++.h>
using namespace std;
int main() {
  int *bian;//声明指针变量
  int jun = 1;
  bian = &jun;将jun的地址赋给变量
  printf("%d", bian);//输出指针变量中的储存的值(不是地址)
  system("pause");
}

输出的结果是:

这个是变量jun的内存地址。为什么在输出时把*bian改成了bian结果就会变成这个样子了呢?细心的人可能已经知道了,在这一行:

bian = &jun;将jun的地址赋给变量

我们运用了“&”符号,它的作用就是取地址。讲到这里应该就能理解带*号和不带*的区别了吧,我们先将地址储存到了指针变量中,在输出时如果我们想输出储存的变量的值那么就需要带上“*”,因为它的意思我们刚才讲过了,是指向一个变量,而我们定义的变量就是jun,而不是jun的地址。