算法类问题
⑴ 关于一个算法的问题
1.从攻击角度看,由于写入时存在前提条件1,因此,可以根据写入的时间延迟来判断写入的是0还是1。再根据其他前提条件可以得出写入的所有数字序列。
2.从防止攻击角度看,只有在前提条件1处设计算法来迷惑攻击。下面结合算法条件、要求和目的来谈谈算法问题。为了节省时间的要求,仅考虑每次写入的时间延迟上限为2秒。
(1).最简单的算法就是前提条件1,原因是攻击者无法判断出写入延迟时间为2秒时写入的是0还是1。但是,这个算法将受到门槛攻击,也就是说,最简单的攻击方法就能直接命中。
(2).进一步考虑,除了的写入延迟时间为1秒时必然会被识别出写入0以外,新算法只要在写入0的地方将时间延迟延长为2秒就可以迷惑攻击。问题是需要在哪几个写入0的地方进行时间延迟呢?
(3).假设写入的数字序列总个数为N,其中数字1的个数为n,那么在某个0位置上进行时间延长,受到攻击的概率则为1/C(n+1,1)=1/(n+1);同理可以计算出在某两个0位置上进行时间延长受到攻击的概率为1/C(n+1,2),以次类推,在某m个0位置上进行时间延长受到攻击的概率则为1/C(n+1,m)。由上面的推导可以得出,受到攻击的概率最小的地方是在m=(n+1)/2个0位置上进行时间延长。当然实际上m取(n+1)/2与(N-n)之间的较小值。一个极端的情况是当n=0时,m可以取1或以上任一个值。因此,问题就演变为在时间损失与攻击概率之间的取舍了。
⑵ 数学建模的十类算法
1、蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法)
2.数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab作为工具)
3.线性规划、整数规划、多元规划、二次规划等规划类问题(建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo软件实现)
4.图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备)
5.动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法是算法设计中比较常用的方法,很多场合可以用到竞赛中)
6.最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用)
7.网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具)
8.一些连续离散化方法(很多问题都是实际来的,数据可以是连续的,而计算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的)
9.数值分析算法(如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用)
10.图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab进行处理)
⑶ 有关算法的问题
您好,您问答这个问题很好,很有意义。
您的这个问题与电脑的计算过程有关,和编程语言也有关。A与C,是两个大数,B相对来说就很小。按您的计算结果,情况应该是这样:编程语言编译时是从左到右对计算进行编译(部分编译器会反方向进行),此时,A和C会被识别为浮点型,B识别为整型(不知道您是什么编译器,什么语言,这里假设是弱类型的语言),那么运算时,A先与B运算,就是一个浮点型与一个整型运算,自动类型转换会转换C为浮点型(在运算中,较低“等级”的类型与较高“等级”的类型运算时,会自动类型转换),此时相当于一个大数与一个接近0的数相加,根据IEEE标准,浮点数是由符号位S、阶码E和尾数M组成,其中能够决定精度的尾数M在单精度浮点数里面,仅有23位,那么在A与B相加后,可以“认为”A+B=A,因为这个“小数”1,在产生的结果中“不存在”,因为这个A的尾数的最低一位表示的值都比1大。
这样,A+B+C就是0,而先算浮点数的算法却不同,因为A+C算完了,其结果大约是绝对值小于1e-6的一个数(也就是说,对于浮点数,不存在真正意义上的0的说法,浮点数里面,认为小于1e-6的数,就是0),此时在与1相加,提升为浮点型后,这个小于1e-6的尾数在新的浮点数里面也就“不存在”了,与上边所说的A+B“相当于”没加是一个道理。
您问的这个问题,是编程与科学计算中一个基本问题,就是计算方法里面的精度问题。在用计算机处理数据时,此类问题处理不好,会对计算结果产生关键影响。更详细的细节建议网络相关内容进行学习。
参考:http://ke..com/link?url=-eAbFbjw_t_HG9vjrxEN5q
⑷ 给出一些基本的算法问题并给出答案
C语言算法基础
算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法
此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在x[10]。
void main()
{ int a[101],x[11],i,p;
for(i=0;i<=11;i++)
x[i]=0;
for(i=1;i<=100;i++)
{ a[i]=rand() % 100;
printf("%4d",a[i]);
if(i%10==0)printf("\n");
}
for(i=1;i<=100;i++)
{ p=a[i]%10;
if(p==0) p=10;
x[p]=x[p]+1;
}
for(i=1;i<=10;i++)
{ p=i;
if(i==10) p=0;
printf("%d,%d\n",p,x[i]);
}
printf("\n");
}
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
(4) m←n,n←r,再重复执行(2)。
例如: 求 m=14 ,n=6 的最大公约数. m n r
14 6 2
6 2 0
void main()
{ int nm,r,n,m,t;
printf("please input two numbers:\n");
scanf("%d,%d",&m,&n);
nm=n*m;
if (m<n)
{ t=n; n=m; m=t; }
r=m%n;
while (r!=0)
{ m=n; n=r; r=m%n; }
printf("最大公约数:%d\n",n);
printf("最小公倍数:%d\n",nm/n);
}
三、判断素数
只能被1或本身整除的数称为素数 基本思想:把m作为被除数,将2—INT( )作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
void main()
{ int m,i,k;
printf("please input a number:\n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) break;
if(i>=k)
printf("该数是素数");
else
printf("该数不是素数");
}
将其写成一函数,若为素数返回1,不是则返回0
int prime( m%)
{int i,k;
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) return 0;
return 1;
}
⑸ 关于计算机算法问题
是这样 把思路转化为算法 然后化为程序语言(有各种的程序语言) 然后用特定的编译器执行语言 最后就是你看到的了
⑹ 举例说明算法领域的P类问题和NP类问题。为什么说现代计算机只能解决确
P:多项式时间内可以解决,太多了,如排序问题
NP:多项式时间内可以验证,如大数分解问题,随便给你一个非常大的数(该数由两个非常大的素数相乘得来),你没法很快将其分解为两个素数的乘积,但若是把这两个素数告诉你,你可以很快的验证它是由这两个素数相乘得来(即多项式时间可验证)
上述两个概念一开始是用来描述判定问题的,后来被拓展到其他问题(如优化问题)上
现代计算机一就是冯洛伊曼结构,哪怕改成哈佛结构,也依旧只是一台图灵机,其表述能力无法超过图灵机范畴,所以只能解决确定性图灵机问题(这个名词我没听过,所以只能猜测其表示的意思)
⑺ 关于算法的问题
B
算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题一个算法应该具有以下五个重要的特征:
1、有穷性: 一个算法必须保证执行有限步之后结束;
2、确切性: 算法的每一步骤必须有确切的定义;
3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;
4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成
程序(港台称之为程式) program(me)或procere
概念1.:为进行某活动或过程所规定的途径。
概念2.程序是由序列组成的,告诉计算机如何完成一个具体的任务。由于现在的计算机还不能理解人类的自然语言,所以还不能用自然语言编写计算机程序。
⑻ 一个有趣的算法问题。
很有趣,讨论一下吧:
先随机放个A,
将它的周围8个位置编号1,2,3,4,5,6,7,8
从1号到8号依次放楼,能放D就放D,不能就放C,C还不能就放B,
然后再以已放好的这九个为中心,放它周围的16个,
按相同的规则编号,然后放楼。
这样继续下去,直到放完。
如果碰到边界,也没关系,把除去边界部分编号处理。
这里有三个不确定的问题:
1、随机放和指定地方放,结果相同吗?
(可以调试测出)
2、先放A和先放B,C,D结果相同吗?
(也可以调试测出)
3、按这个路径扩展结果是不是最好的,还是按其他路径扩展会更好。
(找几条路径试试)
⑼ 高中算法问题
求1+3+5+...+31的值按照我们以前的算法应该是:
第一步:0+1=1
第二步:1+3=4
第三步:4+5=9
......
第i步:
观察可知,第一步的结果+3=第二步的结果
第二步的结果+5=第三步的结果
以此类推
这个i表示的含义就是1,3,5,7...31
而p的含义就是每一步的累积量
现在我们按照你给的答案写出前几步来找规律
p=0【p是累计变量此时为0】
i=1【i是要加的数,第一个要加的数当然是1】
p=p+i
即p=0+1=1【注意这里的=是赋值符号,p只是一个代号,就像x,代表的是一个未知量,并不是一个具体的数值,你可以联想x是不是可以等于1也可以等于2或者等于100,这里的p也是这个道理,p也可以等于p+i,再或者你可以把前面的p当做p1来处理,即,p1=p+i】
i=i+2
即i=1+2=3【这里的=也是赋值符号,道理同上】
此时进行判断,i=3>31否,因此继续循环
p=p+i
即p=1+3=4
i=i+2
即i=3+2=5
进行判断,i=5>31否,继续循环
p=p+i
即p=4+5=9
i=i+2
即
i=5+2=7
进行判断,i=7>31否,继续循环
.......
现在是不是可以发现什么规律:p=0+1+3+5+7+......
i=1
i=3
i=5
i=7
.......
p=p+i
i=i+2因此你的问题就有了答案:
p代表的是每算一步累计的和,而i表示每次加的那个数。
p变成p+i的原因是:累计和=前一步算的数+这一步要加的数【累积和p=前一步算出的p+这一步要加的数i】
i变成i+2的原因是你加的数是1
3
5
7...每次都比上一次的多2,因此i=i+2
为什么由p=p+i
又推到
i=i+2
?当你得出了累积和p时肯定要接着加一个数i来计算下一步的累计和p,而要加的这个数i是1
3
5
7
9。它并不是一个固定的数,而是每算一步就多加2.
设p=0是因为一开始的累计和为0
i=1是因为第一个要加的数为1
下面我给你做一下拓展:
求1+2+3+4+5+.......+31的和
想一下这道题和上面那道有什么不同点,是不是由每次的多加2变成了多加1,因此算这道题时只需要将上一道题里面的i=i+2换成i=i+1即可
让p=0还有一个原因是为了计算方便,你可能会想第一步的和应该是1,为什么不让p=1呢,这样就会少算一步,计算时很容易出错,因此将第一步的和记为0
这类算法的问题
你可以按照答案自己多写几步,就能发现它们之间的关系,掌握了技巧就不难了。希望你能尽快学会,加油哦!
⑽ 高二数学,算法问题!
INPUT a,b,c
IF a>b and a>c THEN
PRINT a
ELSE
IF b>c THEN
PRINT b
ELSE
PRINT c
END IF
END IF
END