目录
目录
2.1程序 = 算法 + 数据结构
2.2什么是算法
2.3简单的算法举例
例题1.判定2000-2500年中的每一年是否为润年,并将其结果输出。
例题2.求1 - 1/2 + 1/3 - 1/4+ ....+ 1/99 - 1/100
例题3:给出一个大于或者等于3的正整数,判断他是不是素数。
2.4算法的特性
2.5三种基本结构
1.顺序结构
2.选择结构
3.循环结构
2.6习题讲解
例题1.依次将十个数输入,要求输出其中的最大值
例题2.求1+2+3+...+100
例题3.判断一个数n能否同时被3和5整除。
例题4.求俩个数m和n的最大公约数
一个程序包括以下俩方面信息:
1.对数据的描述。在程序中要值定用到哪些数据,以及这些数据的类型和数据的组织形式。这就是数据结构。
2.对操作的描述。要求计算机进行的步骤,也就是算法。
计算机算法可分为两大类别:数值运算算法和非数值运算算法。
数值运算算法:目的就是求数值的解,例如求方程的根、求一个函数的定积分等,都属于数值运算的范围。
非数值运算:涉及的面十分广泛,最常见的就是用于事务管理领域,例如对一批职工按姓名排序、图书检索、人事管理和行车调度等管理。
首先分析润年的条件:
1.能被4整除,但不能被100整除的年份都是润年,如1996年、2008年、2012年等等;
2.能被400整除的年份是润年。例如1600年,2000年是润年。
不符合这俩条件的年份不是润年。例如2009年、2100年不是润年。
int main()
{
int year = 0;
for (year = 2000; year <= 2500; year++)
{
if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))//写出判断的条件
{
printf("year = %d ", year);
}
}
return 0;
}
运行结果:
首先分析,此运算可以分为两部分,一部分为正数即: 1 + 1/3 + 1/5 +.... + 1/99这部分
另一部分为: -1/2 - 1/4 +..... -1/100这部分。因此最终的结果就是这俩部分相加的合
int main()
{
float postive_sign = 1;//存放正数
float i = 0;
float postive_sum = 0;//存放正数相加的合
float negative_sign = -1;//存放负数
float negative_sum = 0;//存放负数相加的合
float sum = 0;
for (i = 1; i < 100; i += 2)
{
postive_sum += (postive_sign / i);
}
for (i = 2; i <= 100; i += 2)
{
negative_sum += (negative_sign / i);
}
sum = postive_sum + negative_sum;
printf("%lf\n", sum);
return 0;
}
运行结果:
首先对它进行分析,所谓素数,是指除了1和他本身之外不能被任何其它整数除的是数,因此判断素数有俩种,一种是从将2 ~(n - 1)的各个整数先后作为除数,如果都不能被整除,则n是素数。第二种,将2 ~该数的平方根的各个整数先后作为除数,如果都不能被整除,则n也是素数。法二的核心就,一个素数不可能被除他本身的数整除,因此他被拆成一半时也任然成立,也因为大于他一半的数成最小的数2也比它本身大,也因此只用考虑它开平方之前的数
方法一:
int main()
{
int num = 0;
int i = 2;
int flag = 0;
scanf("%d", &num);
while (i < num)
{
if (num % i == 0)
{
flag = 1;
break;
}
i++;
}
if (flag == 1)
{
printf("不是素数\n");
}
else
{
printf("是素数:%d\n", num);
}
return 0;
}
方法二:
int main()
{
int num = 0;
scanf("%d", &num);
int half = sqrt(num);
int i = 2;
int flag = 0;
while (i <= half)
{
if (num % i == 0)
{
flag = 1;
break;
}
i++;
}
if (flag == 1)
{
printf("不是素数\n");
}
else
{
printf("是素数:%d\n", num);
}
return 0;
}
运行结果:
1.有穷性。一个算法应包含有限的操作步骤,不能是无限的。
2.确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱俩可的。
3.有零个或多个输入。所谓输入是指在执行算法的时需要从外界取得必要的信息。例如刚刚的例题3中,判断是否为素时,所输入的数。
4.有一个或多个输出。算法的目的是为了求解,"解"就是输出。例如例题的算法,最后输出的n"是素数"或"n不是素数"就是输出的信息。一个算法得到的结果就是算法的输出。没有输出的算法是没有意义的。
5.有效性。算法中的每一步都应当能有效地执行,并得到确定的结果。
即在执行完A框所指定的操作后,必然接着执行B框所指定的操作。顺序结构是最简单的一种基本结构
选择结构又称选取结构或分支结构,如图所示。虚线框内是一个选择结构。此结构中必包含一个判断框。根据给定的条件p是否成立而选择执行A框或者B框
循环结构又称重复结构,即反复执行某一部分操作。有俩类循环结构。
1.当型(while型)循环结构。他的作用是给定的条件p1成立时,执行A,在判断p1是否成立,如果成立在重复执行A直到A不成立为止。
2.直到型(until型)循环结构。他的作用是先执行A判断给定的条件p2是否成立如果不成立,再执行A直到p2成立为止。
int main()
{
int arr[10] = { 0 };
int i = 0;
int max = 0;
max = arr[0];//将第一个数放到Max中
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < 10; i++)
{
if (max < arr[i])//将每个数与max进行比较
{
max = arr[i];//如果比他大就让把较大值赋给max;
}
}
printf("%d\n", max);
return 0;
}
运行结果:
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
运行结果:
int main()
{
int n = 0;
scanf("%d", &n);
if ((n % 3 == 0) && (n % 5 == 0))
printf("%d能被整除\n", n);
else
printf("%d不能被整除\n", n);
return 0;
}
运行结果:
int main()
{
int m = 0;
int n = 0;
scanf("%d%d", &m, &n);
int min = m > n ? n : m;//将m 和 n中的最小值保存下来
while (1)
{
if (m % min == 0 && n % min == 0)//让m和n同时除以它们的最小值,如果同时整除就是最大公约数
break;
min--;
}
printf("%d\n", min);
return 0;
}
运行结果:
今天的内容就到这里了,如果有错误的地方希望各位多多指正。