高效算法
❶ 编一高效算法,求1!+2!+3!+.......+n!
。。。。。。。
#include <stdio.h>
#include <stdlib.h>
fun(int x);
int main(void)
{
char *pszBuff = NULL;
int a;
int i=1;
int sumResult = 0;
printf("input a int number::");
scanf("%d", &a);
for(i=1;i<=a;i++)
{
int tmp = fun(i);
sumResult = sumResult + tmp ;
printf("%d!=%d, 1-%d的阶皮旅乘的宽卜和为%d\n",i,tmp,sumResult );
}
return 0;
}
int fun(int x)
{
int ret;
if(x == 1) return 1;
ret = fun(x-1)*x;
return ret;
}
MM有空多看看书啊。。慎握穗。
❷ 怎样才算高效的算法
算法的高效:是你的循环指令的条数。这汪答乎个和时间复杂度o(n)有点相近。
一般来说,你的指令条数少,编译成汇编的指令条数相对来说一般也少。我们的计算机是存储指令困悉数据模式的,一条指令执行完再执行另外一条指令。
一般来说对于排序算法,冒泡的时间复杂度为0(n*n),快速排序nlog(n),(最快的是桶排序算法)。基于此的比较,写起来的程序举扰,相对而言,快速排序的平均指令条数要少于冒泡排序。
❸ 《高效算法竞赛、应试与提高必修128例》pdf下载在线阅读,求百度网盘云资源
《高效算法》([法] Christoph Dürr)电子书网盘下载免费在线阅读
资源链接:
链接:https://pan..com/s/17jSKaBY6XgJIvU0DczbbOA 提取码:ettv
书名:高效算法
作者:[法] Christoph Dürr
译者:史世强
出版社:人民邮电出版社
出版年份:2018-5
页数:204
内容简介:
本书旨在探讨如何优化算法效率,详细阐述了经典算法和特殊算法的实现、应用技巧和复杂度验证过程,内容由浅入深,能帮助读者快速掌握复杂度适当、正确率高的高效编程方法以及自检、自测技巧,是参加ACM/ICPC、Google Code Jam 等国际编程竞赛、备战编程考试、提高编程效率、优化编程方法的参考书目。
作者简介:
Christoph Dürr
法国国家科学研究院研究员,巴黎皮埃尔-玛丽•居里大学博士生导师,Operation Research科研组研究主任。
Jill-Jênn Vie
法国高等电力学院博士、算法讲师,担任法国高等师范学院Paris-Saclay团队在ACM竞赛中的算法导师;曾任法国国际编程大赛Prologin主席,并于2014年获Google RISE Award。
❹ C语言中,求两个数的最小公倍数,的“高效”算法是
这思路我自己想的,但是我也说不太明白,反正我知道怎么回事
1先判断大数%小数是不是0,是0那么大数就是最小公倍数
2不是的话,让大数%小数得到一个数,让小数%得到的数,如果得0
那么让大数*(小数/(大数%小数)),得到得数是最小公倍数
3如果2中小数%得到的这个数不等于0,那么恭喜你,这两个数的最小公倍数就是:大数*小数
4如果这两个数相等,那么,随便一个都是最小公倍数
纯手打,今天刚好做这个题,看到网上没什么答案,我就写写我的思路
C++语法如下:
int pd(int A,int B);
int main() {int i, k;goto C;
C: {
printf("第一个数:"); scanf("%d", &i);
printf("第二个数:"); scanf("%d", &k);
printf("这两个数的公倍数为:%d\n\n", pd(i, k));
goto C; }
return 0;
}
int pd(int A, int B) {
int P;
if (A > B) {
if (A%B == 0) { P = A; }
else if (B % (A%B) == 0) { P = A*(B / (A%B)); }
else { P = A*B; }
}
else if (B > A) {
if (B%A == 0) { P = B; }
else if (A % (B%A) == 0) { P = B*(A / (B%A)); }
else { P = B*A; }
}
else { P = A; }
return P;
}
❺ C语言,已知线性表中的元素以值递增有序排列,并以单链表作存储结构,高效算法怎么算
一个功缺辩能函数:
#include<stdio.h>
#include<stdlib.h>
typedefstructlist{
intdata;
structlist*next;
}list;
voidfun(list*head,intmink,intmaxk){
list*pre,*p;
pre=head;
p=pre->next;
while(p){
if(p->data>mink&&p->data<maxk){
pre->next=p->next;
p=pre->next;
}
else{
pre=pre->next;
p=pre->next;
}
}
}
❻ C语言编程(高效算法):3的1000次幂
需要用高精度,写起来会比较繁
至于高效,可以先计算
3^2,3^4,3^8,3^16,3^32,3^64...3^1024
2^1000 = 3^8 * 3^32 * 3^64 * 3^128 * 3^256 * 3^512
❼ 数据结构:设计一个高效算法,将顺序表中的所有元素逆置,要求算法空间复杂度为O(1)。
设计一个高效算法,将顺序表中的所有元素逆置,要求算法空间复杂度为O(1)扫描顺序表L的前半部分元素L.data[i] (0<=i<L.length/2),将其与后半部分的对应元素L.data[L.length-1-i]进行交换即可。
顺序表的存储只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L是元素占用存储单元的长度。
(7)高效算法扩展阅读:
数据的物理结构是数据结构在计算机中的表示,它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种。
数据元素的机内用二进制位(bit)的位串表示数据元素。当数据元素有若干个数据项组成时,位串中与各个数据项对应的子位串称为数据域(data field)。
❽ 数据结构:设计一个高效算法,将顺序表中的所有元素逆置,要求算法空间复杂度为O(1)。
数据结构的高效算法:for(int i = 0; i < array.length / 2; i++) {swap(array[i], array[array.length - i - 1])}
只有swap函数需要一个字节的内存,所以空间复杂度O(1)。
❾ 如何设计一个高效算法,找到第一次重复出现的字符
定义字符串类的映射map类,建立map类对象。通过循环读入字符串到映射对象,遍历映射对象的迭代器,统计字符串出现次数,输出字符串和出现次数。给你个例子吧:
#include <iostream>#include <fstream>#include <map>#include <string>using namespace std ;int main ( int argc, char* argv [ ] ) { typedef map < string , int > WordMap ; // 定义特定的字符串映射类型 typedef WordMap :: iterator wmIter ; // 定义该类型的迭代器 const char* fname = "city.txt" ; // 缺省文件名串 if ( argc > 1 ) fname = argv [ 1 ] ; // 读入命令行的第一个参数,作为文件名路径串 ifstream in ( fname ) ; // 打开文件输入流 if ( ! in ) { // 如果打开错误,则显示提示信息后退出 cout << " Open file " << fname << " error ! " << endl ; system("pause"); return 1 ; } WordMap wordmap ; // 定义单词映射对象 string word ; // 定义单词字符串对象 while ( in >> word ) wordmap [ word ] ++ ; // 从文件中读入单词 // 遍历容器,显示输出计数大于等于2的单词和计数 for ( wmIter w = wordmap . begin ( ) ; w != wordmap . end ( ) ; w ++ ) if ( w->second >= 2 ) cout << w->first << " : " << w->second << endl ; system("pause"); return 0 ;}
❿ 数据结构 设计高效算法问题
// 要求是删除顺序表中在范围[x, y]内的元素。
// 按常规思路,每删除一个顺序表元素,则要将其后的元素整体前移一个位置。这种算法用到了双重for循环,时间复杂度为O(n^2)。
// 以下的算法只用到了单重for循环,时间复杂度为O(n)。原理是把所有不在范围[x, y]内的元素依次保存到顺序表的前部,而不处理本来要删除的、在范围[x, y]内的元素。当把所有不需要删除的元素都保存到了顺序表前部,只需要重新设置一下顺序表的长度为“前部”的最大下标+1,就模拟了删除操作。
void fun(SqList *&L, ElemType x)
{
// i为循环计数器。
// j为不需要删除的元素个数,初始化为0。
int i, j = 0;
// 依次遍历顺序表的每个元素
for (i = 0; i < L->length; ++i)
{
// 只处理不需要删除的元素,即不属于区间[x, y]的元素
if (!(L->data[i] >= x && L->data[i] <= y))
{
// 每找到一个不需要删除的元素,就把该元素保存到下标j的位置。
L->data[j] = L->data[i];
// 随后令j自增1。之前j代表的是处理后的顺序表的最大下标,现在j代表的是处理后的顺序表的长度。由于下标从0开始,所以长度永远比最大下标大1。
++j;
}
}
// 设置顺序表的长度为j,这样以后遍历顺序表只能访问前j个元素。即使下标j之后可能还存在属于[x, y]的元素,但是不会访问到它们,自然相当于“删除”了。
L->length = j;
}