怎么写算法说明( 二 )


(二)运用乘法的交换律、结合律进行简算 。
如:2.5*0.125*8*4等,如果遇到除法同样适用,或将除法变为乘法来计算 。如:8.3*67÷8.3÷6.7等 。
(三)运用乘法分配律进行简算,遇到除以一个数,先化为乘以一个数的倒数,再分配 。
如:2.5*(100+0.4),还应注意,有些题目是运用分配律的逆运算来简算:即提取公因数 。如:0.93*67+33*0.93 。
(四)运用减法的性质进行简算 。减法的性质用字母公式表示:A-B-C=A-(B+C),同时注意逆进行 。
如:7691-(691+250) 。
(五)运用除法的性质进行简算 。除法的性质用字母公式表示如下:A÷B÷C=A÷(B*C),同时注意逆进行,
如:736÷25÷4 。
(六)接近整百的数的运算 。这种题型需要拆数、转化等技巧配合 。
如;302+76=300+76+2,298-188=300-188-2,等 。
(七)认真观察某项为0或1的运算 。
如:7.93+2.07*(4.5-4.5)等 。
总的说来,简便运算的思路是:(1)运用运算的性质、定律等 。(2)可能打乱常规的计算顺序 。(3)拆数或转化时,数的大小不能改变 。(4)正确处理好每一步的衔接 。(5)速算也是计算,是将硬算化为巧算 。(6)能提高计算的速度及能力,并能培养严谨细致、灵活巧妙的工作习惯 。
5. 算法编写: 帮忙在解释一下原理,谢谢 这个题可以有两种写法,一种是用单链表,把链表的尾连到链表的头上 。
另一种是用数组来模拟,每次到尾部的时候,就把下脚标重置成0.
我下面写的是用数组模拟的 。思路是这样的:
模拟一个真实的数数过程,如果数到3,就被淘汰,如果数到了末尾,就从头接着数,直到只剩下两个人为止 。
在程序中,a[i]是一个标记,如果已经数到3,被淘汰,那么设置为1,如果没有数到三,则值为0;
然后写一个while循环,如果只剩2个人(count == 2)2,说明已经数完了,就退出循环,不然就一直数下去 。这里,num是计数器,数到3就淘汰一人(a[index]=1) 。
程序如下,已用devc++编译测试通过,结果正确 。
#include <stdio.h>
int main()
{
int a[40];
int n;
printf("请输入一共有多少人: ");
scanf("%d", &n);
int count = n, num = 1, index = 0, i;
for(i = 0; i < n; i ++) a[i] = 0;//清零
while(count > 2)
{
if(a[index]) {index ++; if(index > n - 1) index = 0; continue;}
if(num == 3)
{
num = 1;
count --;
a[index] = 1;
index ++;
if(index > n - 1) index = 0;
continue;
}
num ++;
index ++;
if(index > n - 1) index = 0;
}
for(i = 0; i < n; i ++)
if(a[i]== 0) printf("%d\n", i + 1);
return 0;
}
6. 帮忙写个算法哈 若要在n个城市之间建设通信网络,只需要架设n-1条线路即可 。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题 。
(1)建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数组,一个存储顶点,一个存储边,存储边的数组表明节点间的连通关系和边的权值;
(2)利用普里姆算法和克鲁斯卡尔算法求网的最小生成树;
(3)按顺序输出生成树中各条边以及它们的权值 。
【算法描述】:
1 普里姆算法:以图中的节点为基础 。从某一点出发,选择该点相连的边的最小边,直至图中所有节点都出现在生成树中 。
2 克鲁斯克尔算法:以图中节点为基础 。将图中的所有边按权值大小排列 。从小到大依次选择边,知道这些边将所有节点都联通 。
数据结构:
邻接矩阵(二维数组) 无向图(结构) 结构