http://www.cppblog.com/linqiu/archive/2007/08/01/29145.html
- #include <iostream>
- #include <cmath>
- using namespace std;
- int gcd(int a, int b);
- int ngcd(int *a, int n);
- int lcm(int a, int b);
- int nlcm(int *a, int n);
- int main()
- {
- //int a,b;
- //cin >> a >> b;
- //cout << lcm(a, b) << endl;
- int *a = new int[3];
- a[0] = 3;
- a[1] = 4;
- a[2] = 5;
- cout << nlcm(a, 3) << endl;
- return 0;
- }
- //两个数的最大公约数--欧几里得算法
- int gcd(int a, int b)
- {
- if (a < b)
- swap(a, b);
- if (b == 0)
- return a;
- else
- return gcd(b, a%b);
- }
- //n个数的最大公约数算法
- //说明:
- //把n个数保存为一个数组
- //参数为数组的指针和数组的大小(需要计算的数的个数)
- //然后先求出gcd(a[0],a[1]), 然后将所求的gcd与数组的下一个元素作为gcd的参数继续求gcd
- //这样就产生一个递归的求ngcd的算法
- int ngcd(int *a, int n)
- {
- if (n == 1)
- return *a;
- return gcd(a[n-1], ngcd(a, n-1));
- }
- //两个数的最小公倍数(lcm)算法
- //lcm(a, b) = a*b/gcd(a, b)
- int lcm(int a, int b)
- {
- return a*b/gcd(a, b);
- }
- //n个数的最小公倍数算法
- //算法过程和n个数的最大公约数求法类似
- //求出头两个的最小公倍数,再将欺和大三个数求最小公倍数直到数组末尾
- //这样产生一个递归的求nlcm的算法
- int nlcm(int *a, int n)
- {
- if (n == 1)
- return *a;
- else
- return lcm(a[n-1], nlcm(a, n-1));
- }
- ----------------------------------分割线-------------------------
- 今天写一道题方法很类似,是求多个数与非
- nand(与非)
-
∙ 0 nand 0 = 1
∙ 0 nand 1 = 1
∙ 1 nand 0 = 1
∙ 1 nand 1 = 0 - #include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define SIZE 200010
using namespace std;
int nand(int a,int b){
return !(a&&b);
}
int nnand(int *a,int n){
if(n==0)
return (*a);
return nand(a[n],nnand(a,n-1));
}
int main(){
int n,a[SIZE];
cin>>n;
for(int i=0;i<=n;i++)
cin>>a[i];
int ans=nnand(a,n);
cout<<ans<<endl;
return 0;
}