算法设计与分析Day01
1 1+2 1+2+3 1+2+3+4…
int main()
{
int temp = 0, sum = 0;
for (int i=1;i<=100;i++)
{
temp += i;
sum += temp;
}
cout << sum;
}
给出一个数字的循环小数表示法
补充知识
-
余数检测法
就是模拟除法的过程,比如我们要计算 1/7 这个小数的循环节,我们事先求出整数部分,也就是 1/7=0。然后再求小数部分,求出第一组商 con 和它所对应的余数 r,不难得出,con=(1×10)/7=1,r=(1×10)%7=3,如果想不明白,可以自己手算一下,然后进入循环,将第一组数据保存起来,接着算第二组,con=(3×10)/7=4,r=(3×10)%7=2。 -
不论 vector 对象本身是否是常量,返回值都是 const_iterator ,const_iterator 是声明 iterator 指向的对象是常量,即 iterator 指向常对象,其本身可以变。
如果 vector 对象不是常量,既可以使用 iterator 也可以使用 iterator_const
iterator 能读写 vector::iterator 中的元素vector<int>::iterator p = find(ar2.begin(), ar2.end(), 2); cout << *p;
主要代码片段:
int f(int n, int m)
{
n = n % m;
vector<int> v;
for (;;)
{
v.push_back(n);
n *= 10;
n = n % m;
if (n == 0) { return 0; }
if (find(v.begin(), v.end(), n) != v.end())//v中可以找到n
{
int i= (int)(v.end()-find(v.begin(),v.end(),n));
return i;
}
}
}
其他事项
- 示例:
时间复杂度为O(n!)
m=1 1*2 1*2*3 1*2*3*4 1*2*3*4*5
- 每个数可以分解为若干素数的乘积(并且这种分解是唯一的),那么这个数所有因数就是这些素数任意组合后的乘积。
2.两个数的最大公因数就等于他们共有的那些素数乘起来,即重复部分。
而两个数最小公倍数就等于他们所有素数乘起来,并且去除重复部分。3.最大公因数乘最小公倍数就等于这些素数全部乘起来,就是这两个数乘积。
#include <stdio.h>
int FindPrime (int num_1,int num_2);
void Max_swap (int* bigger,int* smaller);
int main ()
{
int num_1, num_2,Prime,LCM;//Prime为最大公因数,LCM(Least common multiple) 最小公倍数
scanf ("%d %d",&num_1,&num_2);
Prime = FindPrime (num_1,num_2);
LCM = num_1*num_2/Prime;
printf ("^Prime = %d^\n^Least common multiple = %d^\n",Prime,LCM);
return 0;
}
int FindPrime (int num_1,int num_2)
{//求最大公因数,更相减损法
int temp = 1;
while (temp){
Max_swap (&num_1,&num_2);//总是将 num_1 调成大于num_2
temp = num_1 - num_2;
num_1 = temp;
}
return num_2;
}
void Max_swap (int* bigger,int* smaller)
{//将两个数重新排列 并总是将第一个数置为更大的一个
if (*bigger<*smaller){
int temp;
temp = *bigger;
*bigger = *smaller;
*smaller = temp;
}
}
---------------------
作者:yxp189
来源:CSDN
原文:https://blog.csdn.net/yxp189/article/details/80761524
更相减损法,又称 “等值算法”
更相损减法在两数相差较大时,时间复杂度容易退化成 O (N),而辗转相除法可以稳定在 O (logN)。但辗转相除法需要试商,这就使得在某些情况下,使用更相损减法比使用辗转相除法更加简单
612-468=144,
468-144=324,
324-144=180,
180-144=36,
144-36=108,
108-36=72,
72-36=36.
因此 612 与 468 的最大公约数是 36.