• 关于 c语言n=c> 的搜索结果

回答

很基础的排序,C++版:(键盘输入输出) #include <iostream> using namespace std; int sort(int n) { int i,j,temp; for (i=1;i<n;i++) for (j=0;j<n-i;j++) if (a[j]>a[j+1]) {temp=a[j];a[j]=a[j+1];a[j+1]=temp;} } int main(void) { int i,n; cin>>n; int *a=new int[n]; for (i=0;i<n;i++) cin>>a[i]; sort(n); for (i=0;i<n;i++) cout<<a[i]<<" "; return 0; } 再来一个C语言版: #include <stdio.h> int sort(int n) { int i,j,temp; for (i=1;i<n;i++) for (j=0;j<n-i;j++) if (a[j]>a[j+1]) {temp=a[j];a[j]=a[j+1];a[j+1]=temp;} } int main(void) { int i,n; scanf("%d",&n); int *a=new int[n]; for (i=0;i<n;i++) scanf("%d",&n); sort(n); for (i=0;i<n;i++) printf("%d ",a[i]); return 0; }

聚小编 2019-12-02 01:17:29 0 浏览量 回答数 0

回答

主要原因是C程序中使用了C语言不支持的引用所致,修改如下: //--------------------------------------------------------------------------- #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct set{ int coef; struct set *next; } set ; void createlist_p(struct set **p,int n) { int i; struct set *L; *p=(struct set *)malloc(sizeof(set)); (*p)->next=NULL; for(i=n;i>0;i--) { L=(struct set *)malloc(sizeof(set)); printf("请输入该集合中第%d个整数元素:",n-i+1); scanf("%d",&L->coef); L->next=(*p)->next; (*p)->next=L; } }//生成新链表用于存放两集合中的元素 void printlist_p(struct set **p) { struct set *L; int i=0; L=(*p)->next; if(!L) printf("该表为空!\n"); while(L!=NULL) { printf("%d ",L->coef); L=L->next; i++; } printf("\n"); }// 打印输入的两集合中的元素 void Addset(struct set **p,struct set **q,struct set **r) { struct set *k,*m,*n; *r=(struct set *)malloc(sizeof(set)); (*r)->next=NULL; k=(*p)->next; for(;k;) { m=(struct set *)malloc(sizeof(set)); m->next=(*r)->next; (*r)->next=m; m->coef=k->coef; k=k->next; }//把第一个集合中的元素放在新集合中 k=(*q)->next; m=(struct set *)malloc(sizeof(set)); m->next=(*r)->next; (*r)->next=m; m->coef=k->coef; k=k->next; for(;k;) { for(n=(*r)->next;(k->coef!=n->coef)&&n->next;){ n=n->next; }//与新集合中的元素比较 if((k->coef!=n->coef)&&!(n->next)){ m=(struct set *)malloc(sizeof(set)); m->next=(*r)->next; (*r)->next=m; m->coef=k->coef; } k=k->next; }//对第二个集合中的元素进行分析 }//求A∪B void Subset(struct set **p,struct set **q,struct set **r){ struct set *k,*m,*n; (*r)=(struct set *)malloc(sizeof(set)); (*r)->next=NULL; n=(*q)->next; for(;n;){ m=(*p)->next; for(;(m->coef!=n->coef)&&m->next;){ m=m->next; } if(m->coef==n->coef) { k=(struct set *)malloc(sizeof(set)); k->next=(*r)->next; (*r)->next=k; k->coef=m->coef; } n=n->next; } }//求A∩B void Intset(struct set **p,struct set **q,struct set **r){ struct set *k,*m,*n; (*r)=(struct set *)malloc(sizeof(set)); (*r)->next=NULL; m=(*p)->next; for(;m;){ n=(*q)->next; for(;(m->coef!=n->coef)&&n->next;){ n=n->next; } if(!n->next&&(m->coef!=n->coef)) { k=(struct set *)malloc(sizeof(set)); k->next=(*r)->next; (*r)->next=k; k->coef=m->coef; } m=m->next; } }//求A-B void bangzhu(void){ printf("\n\t\t\t***********************************"); printf("\n\t\t\t* 求集合的交并差 *"); printf("\n\t\t\t*********************************\n"); } void main(){ struct set *p,*q,*r; int m,n,node; bangzhu(); for(;;){ do{ printf("请输入您要选择操作的代码:\n"); printf("1:求两集合的并A∪B\n"); printf("2:求两集合的交A∩B\n"); printf("3:求两集合的差A-B\n"); printf("0:退出该程序\n"); scanf("%d",&node); } while(node<0||node>3); if(node==0) exit(1); printf("\t\t\t/*请输入集合A中元素的个数:*/\n"); scanf("%d",&m); createlist_p(&p,m); printf("\t\t\t/*请输入集合B中元素的个数:*/\n"); scanf("%d",&n); createlist_p(&q,n); printf("集合A中元素为:"); printlist_p(&p); printf(" 集合B中元素为:"); printlist_p(&q); //while(node<0||node>3); switch(node){ case 1: Addset( &p,&q,&r);printf("A∪B:\n");printlist_p(&r);break; case 2: Subset( &p,&q,&r);printf("A∩B:\n");printlist_p(&r);break; case 3: Intset(&p,&q,&r); printf("A-B:\n");printlist_p(&r);break; } printf("\n"); } } //---------------------------------------------------------------------------

liujae 2019-12-02 01:22:49 0 浏览量 回答数 0

问题

求助C语言(请务必使用C)帮忙改一下。谢谢!

a123456678 2019-12-01 19:22:33 1069 浏览量 回答数 1

试用中心

为您提供0门槛上云实践机会,企业用户最高免费12个月

问题

c语言链表问题

a123456678 2019-12-01 19:48:25 1274 浏览量 回答数 4

回答

1、如果是c语言,必须用struct fusht_t 来定义结构体变量,如果是c++,可以省略struct; 或者这样定义: typedef struct { double real; double i; }fushu; 2、你的程序有一些不合理的地方,每一次调用函数都会动态申请了一个结构体变量,但都没有释放。 修改如下,供参考: #include <stdio.h> #include <stdlib.h> typedef struct { double real; double i; }fushu; fushu* add(fushu a, fushu b){ fushu* ret = (fushu*)malloc(sizeof(fushu)); ret->real = a.real + b.real; ret->i = a.i + b.i; return ret; } fushu* minus(fushu a, fushu b){ fushu* ret = (fushu*)malloc(sizeof(fushu)); ret->real = a.real - b.real; ret->i = a.i - b.i; return ret; } fushu* multiply(fushu a, fushu b){ fushu* ret = (fushu*)malloc(sizeof(fushu)); ret->real = a.real*b.real - a.i*b.i; ret->i = a.real*b.i + a.i*b.real; return ret; } fushu* divide(fushu a, fushu b){ fushu* ret = (fushu*)malloc(sizeof(fushu)); ret->real = (a.real*b.real + a.i*b.i)/(b.real*b.real + b.i*b.i); ret->i = (a.i*b.real - a.real*b.i)/(b.real*b.real + b.i*b.i); return ret; } int main() { char sign; fushu m; fushu n; fushu *p=NULL; scanf("%c%lf%lf%lf%lf",&sign,&m.real,&m.i,&n.real,&n.i); if( sign == '+' ){ p=add(m,n); printf("%.2lf+%.2lfi\n",p->real,p->i); } if( sign == '-' ){ p=minus(m,n); printf("%.2lf+%.2lfi\n",p->real,p->i); } if( sign == '*' ){ p=multiply(m,n); printf("%.2lf+%.2lfi\n",p->real,p->i); } if( sign == '/' ){ p=divide(m,n); printf("%.2lf+%.2lfi\n",p->real,p->i); } if(p) delete p; return 0; }

a123456678 2019-12-02 02:18:55 0 浏览量 回答数 0

回答

//About_C团队解答 //VC6.0环境下编译通过,希望满意(因为你没要求语言,所以我就用C++了) //任何问题,追问我哦 ^_^ #include<iostream> #include<fstream> using namespace std; #define N 5 typedef struct node{ int key; char data; }Node; void ShellSort( Node data[], int n){ Node tmp; int gap; gap = n / 2; while( gap > 0){ for( int i = gap; i < n; i++){ tmp = data[i]; for( int j = i - gap; j >= 0; j -= gap){ if( data[j].key > tmp.key){ data[j+gap] = data[j]; }else{ break; } } data[j+gap] = tmp; } gap /= 2; } } int main(){ Node data[N] = { 5, 'a', 4, 'b', 3, 'c', 2, 'b', 1, 'a'}; ShellSort( data, N); for( int i = 0; i < N; i++){ cout << data[i].key << ":" << data[i].data<< "\t"; } cout << endl; return 0; }

寒凝雪 2019-12-02 01:19:13 0 浏览量 回答数 0

问题

C+语言 碰到输出手法 不能搞定 求解答 (注 : 不用迭代 )

a123456678 2019-12-01 19:22:10 890 浏览量 回答数 1

问题

c语言循环程序出错,编译器好奇怪

a123456678 2019-12-01 19:48:28 796 浏览量 回答数 1

问题

c语言链表节点删除问题求解

a123456678 2019-12-01 20:27:47 747 浏览量 回答数 1

问题

一个c语言的简单acm问题,求两个二进制数有多少位不同,输入的是十进制数.

a123456678 2019-12-01 19:22:39 875 浏览量 回答数 1

问题

关于linux c语言多线程编程的问题

杨冬芳 2019-12-01 20:25:21 1031 浏览量 回答数 2

回答

选择法排序是一种简单的容易实现的对数据排序的算法。 以整形数组元素为例,有数组A[10](以C语言为例描述),即A[0],A[1],…,A[8],A[9](假设其元素均互不相同)。要求对其元素排序使之递增有序。 算法原理:首先以一个元素为基准,从一个方向开始扫描,比如从左至右扫描,以A[0]为基准。接下来从A[0],…,A[9]中找出最小的元素,将其与A[0]交换。然后将基准位置右移一位,重复上面的动作,比如,以A[1]为基准,找出A[1]~A[9]中最小的,将其与A[1]交换。一直进行到基准位置移到数组最后一个元素时排序结束(此时基准左边所有元素均递增有序,而基准为最后一个元素,故完成排序)。 以下为一个用C描述的函数实现上述排序: void sort(int array[],int n) // n 为数组元素个数 { int i,j,k,temp; // i 为基准位置,j 为当前被扫描元素位置,k 用于暂存出现的较小的元素的位置 for(i=0;i<n-1;i++) { k=i; // k 初始化为基准位置 for(j=i+1;j<n;j++) if (array[j]<array[k]) k=j ; // k 始终指示出现的较小的元素的位置 temp=array[k];array[k]=array;array=temp; // 将此趟扫描得到的最小元素与基准互换位置 } } 此算法的实现相对简单,但效率比较低,时间复杂度为O(n2) (n 的平方),为就地排序。 递归法比较好理解`` 计算1+2+....+100的值 #include <stdio.h> main() { printf("%d\n",fun(100));//调用函数fun() } 递归函数 fun(int n) {int t; <br/>if(n==0||n==1) t=1; //如果n为0或为1 输出1 <br/>//n大于0,则为第n项和第n-1项的和,继续调用fun() <br/>//以此类推... <br/>else t=n+fun(n-1); <br/>return t; <br/>} #include <stdio.h> main() {printf("%d\n",fun(100));} fun(int n) {int t; <br/>if(n==0||n==1) t=1; <br/>else t=n+fun(n-1); <br/>return t; <br/>}

管理贝贝 2019-12-02 01:25:13 0 浏览量 回答数 0

问题

请教一个c语言问题。谢谢!

a123456678 2019-12-01 19:23:02 903 浏览量 回答数 1

回答

基本思路:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。可以看出如果有 n 个元素,那么一共要进行 n-1 轮比较,第 i 轮要进行 j=n-i 次比较。 我也不知道你说的是用哪种语言编写:就列出了如下几种,希望你能满意 #include<stdio.h> void main() { int a[10]; int i,j,t; printf("输入10个整数:\n"); for( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); //依次输入10个整数 for( j = 0; j < 9; j ++ ) //进行9轮排序 即n-1次 { for( i = 0; i < 9-j; i ++) //每轮进行n-1-j 次比较,最多n-1-j 次交换 if( a[ i ] > a[ i + 1 ] ) { t = a[ i ] ; a[ i ] = a[ i + 1 ]; //小的沉底,大的上浮 a[ i + 1 ] = t; } } printf("排序结果:"); for( i = 0; i < 10; i ++ ) //依次输出排序结果 printf("%d\t",a[ i ]); printf("\n"); } PASCAL为例子 procedure Bubble_Sort(var L:List); vari,j:position; begin for i:=First(L) to Last(L)-1 do for j:=First(L) to Last(L)-i do if L[j]>L[j+1] then 4 swap(L[j],L[j+1]); //交换L[j]和L[j+1] end; 下面使用c++语言编写 #include<iostream.h> void main() { int a[n],i,j,temp; cout<<"请输入数字:"<<endl; for(i=0;i<=n;i++) cin>>a; //依次输入n个整数 for(i=0;i<n;i++) { for(j=i+1;j<n;j++) if(a<a[j]) //利用临时变量temp交换顺序 { temp=a[j]; a[j]=a; a=temp; } cout<<a<<' '; //依次输出结果 } 下面使用Visual Basic编写 Option Explicit Private Sub Form_Load() Dim a, c As Variant Dim i As Integer, temp As Integer, w As Integer a = Array(12, 45, 17, 80, 50) For i = 0 To UBound(a) - 1 If (a(i) > a(i + 1)) Then '若是递减,改为a(i)<a(i+1) temp = a(i) a(i) = a(i + 1) a(i + 1) = temp End If Next For Each c In a Print c; Next End Sub

祁同伟 2019-12-02 01:17:32 0 浏览量 回答数 0

回答

RSA算法它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字 命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。 一、RSA算法 : 首先, 找出三个数, p, q, r, 其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数 p, q, r 这三个数便是 private key 接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1) 这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了 再来, 计算 n = pq m, n 这两个数便是 public key 编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a < n 如果 a >= n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t), 则每一位数均小於 n, 然後分段编码 接下来, 计算 b == a^m mod n, (0 <= b < n), b 就是编码後的资料 解码的过程是, 计算 c == b^r mod pq (0 <= c < pq), 於是乎, 解码完毕 等会会证明 c 和 a 其实是相等的 :) 如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b 他如果要解码的话, 必须想办法得到 r 所以, 他必须先对 n 作质因数分解 要防止他分解, 最有效的方法是找两个非常的大质数 p, q, 使第三者作因数分解时发生困难 <定理> 若 p, q 是相异质数, rm == 1 mod (p-1)(q-1), a 是任意一个正整数, b == a^m mod pq, c == b^r mod pq, 则 c == a mod pq 证明的过程, 会用到费马小定理, 叙述如下: m 是任一质数, n 是任一整数, 则 n^m == n mod m (换另一句话说, 如果 n 和 m 互质, 则 n^(m-1) == 1 mod m) 运用一些基本的群论的知识, 就可以很容易地证出费马小定理的 <证明> 因为 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整数 因为在 modulo 中是 preserve 乘法的 (x == y mod z and u == v mod z => xu == yv mod z), 所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq 1. 如果 a 不是 p 的倍数, 也不是 q 的倍数时, 则 a^(p-1) == 1 mod p (费马小定理) => a^(k(p-1)(q-1)) == 1 mod p a^(q-1) == 1 mod q (费马小定理) => a^(k(p-1)(q-1)) == 1 mod q 所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1 => pq | a^(k(p-1)(q-1)) - 1 即 a^(k(p-1)(q-1)) == 1 mod pq => c == a^(k(p-1)(q-1)+1) == a mod pq 2. 如果 a 是 p 的倍数, 但不是 q 的倍数时, 则 a^(q-1) == 1 mod q (费马小定理) => a^(k(p-1)(q-1)) == 1 mod q => c == a^(k(p-1)(q-1)+1) == a mod q => q | c - a 因 p | a => c == a^(k(p-1)(q-1)+1) == 0 mod p => p | c - a 所以, pq | c - a => c == a mod pq 3. 如果 a 是 q 的倍数, 但不是 p 的倍数时, 证明同上 4. 如果 a 同时是 p 和 q 的倍数时, 则 pq | a => c == a^(k(p-1)(q-1)+1) == 0 mod pq => pq | c - a => c == a mod pq Q.E.D. 这个定理说明 a 经过编码为 b 再经过解码为 c 时, a == c mod n (n = pq) 但我们在做编码解码时, 限制 0 <= a < n, 0 <= c < n, 所以这就是说 a 等於 c, 所以这个过程确实能做到编码解码的功能 二、RSA 的安全性 RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n 必须选大一些,因具体适用情况而定。 三、RSA的速度 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。 四、RSA的选择密文攻击 RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装( Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构: ( XM )^d = X^d *M^d mod n 前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公 钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用 One-Way HashFunction 对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不同类型的攻击方法。 五、RSA的公共模数攻击 若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则: C1 = P^e1 mod n C2 = P^e2 mod n 密码分析者知道n、e1、e2、C1和C2,就能得到P。 因为e1和e2互质,故用Euclidean算法能找到r和s,满足: r * e1 + s * e2 = 1 假设r为负数,需再用Euclidean算法计算C1^(-1),则 ( C1^(-1) )^(-r) * C2^s = P mod n 另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享模数n。 RSA的小指数攻击。 有一种提高 RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有 所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。 RSA算法是 第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人 们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA 的重大缺陷是无法从理论上把握它的保密性能 如何,而且密码学界多数人士倾向于因子分解不是NPC问题。 RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目 前,SET( Secure Electronic Transaction )协议中要求CA采用比特长的密钥,其他实体使用比特的密钥。 C语言实现 #include <stdio.h> int candp(int a,int b,int c) { int r=1; b=b+1; while(b!=1) { r=r*a; r=r%c; b--; } printf("%d\n",r); return r; } void main() { int p,q,e,d,m,n,t,c,r; char s; printf("please input the p,q: "); scanf("%d%d",&p,&q); n=p*q; printf("the n is %3d\n",n); t=(p-1)*(q-1); printf("the t is %3d\n",t); printf("please input the e: "); scanf("%d",&e); if(e<1||e>t) { printf("e is error,please input again: "); scanf("%d",&e); } d=1; while(((e*d)%t)!=1) d++; printf("then caculate out that the d is %d\n",d); printf("the cipher please input 1\n"); printf("the plain please input 2\n"); scanf("%d",&r); switch(r) { case 1: printf("input the m: "); /*输入要加密的明文数字*/ scanf("%d",&m); c=candp(m,e,n); printf("the cipher is %d\n",c);break; case 2: printf("input the c: "); /*输入要解密的密文数字*/ scanf("%d",&c); m=candp(c,d,n); printf("the cipher is %d\n",m);break; } getch(); }

聚小编 2019-12-02 01:26:32 0 浏览量 回答数 0

问题

c语言结构体数组无法运行?

a123456678 2019-12-01 19:48:24 811 浏览量 回答数 1

问题

请问以下4种关于struct的定义和使用有什么区别么?

a123456678 2019-12-01 19:43:56 891 浏览量 回答数 1

问题

一个简单的C语言程序,无法读入字符变量?

a123456678 2019-12-01 19:51:03 826 浏览量 回答数 1

回答

  递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现像.   程序调用自身的编程技巧称为递归( recursion)。   一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。   一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。   注意:   (1) 递归就是在过程或函数里调用自身;   (2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。   递归算法一般用于解决三类问题:   (1)数据的定义是按递归定义的。(Fibonacci函数)   (2)问题解法按递归算法实现。(回溯)   (3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)   递归的缺点:   递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。   例子:   #include <iostream.h>   void move (char getone,char putone)   {   cout <<getone<<"-->"<}   void hanoi(int n,char one ,char two ,char three)   {   void move (char getone,char putone );   if (n==1)   move (one,three);   else   {   hanoi(n-1,one,three,two);   move (one ,three);   hanoi(n-1,two,one,three);   }   }   void main()   {   void hanoi(int n ,char one ,char two ,char three);   int m ;   cout <<"Input the numberof disker:";   cin>>m;   cout<<"the steps to moving "<<m<<"diskes   :"<<endl;   hanoi(m,'A','B','C');   }   第二章 递归   2.1 递归的概念   2.2 如何设计递归算法   2.3 典型例题   递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写   程序能是程序变得简洁和清晰.   2.1 递归的概念   1.概念   一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).   如:   procedure a;   begin   .   .   .   a;   .   .   .   end;   这种方式是直接调用.   又如:   procedure b; procedure c;   begin begin   . .   . .   . .   c; b;   . .   . .   . .   end; end;   这种方式是间接调用.   例1计算n!可用递归公式如下:   1 当 n=0 时   fac(n)={n*fac(n-1) 当n>0时   可编写程序如下:   program fac2;   var   n:integer;   function fac(n:integer):real;   begin   if n=0 then fac:=1 else fac:=n*fac(n-1)   end;   begin   write('n=');readln(n);   writeln('fac(',n,')=',fac(n):6:0);   end.   例2 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法.   设n阶台阶的走法数为f(n)   显然有   1 n=1   f(n)={2 n=2   f(n-1)+f(n-2) n>2   可编程序如下:   program louti;   var n:integer;   function f(x:integer):integer;   begin   if x=1 then f:=1 else   if x=2 then f:=2 else f:=f(x-1)+f(x-2);   end;   begin   write('n=');read(n);   writeln('f(',n,')=',f(n))   end.   2.2 如何设计递归算法   1.确定递归公式   2.确定边界(终了)条件   练习:   用递归的方法完成下列问题   1.求数组中的最大数   2.1+2+3+...+n   3.求n个整数的积   4.求n个整数的平均值   5.求n个自然数的最大公约数与最小公倍数   6.有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子?   7.已知:数列1,1,2,4,7,13,24,44,...求数列的第 n项.   2.3典型例题   例3 梵塔问题   如图:已知有三根针分别用1,2,3表示,在一号针中从小放n个盘子,现要求把所有的盘子   从1针全部移到3针,移动规则是:使用2针作为过度针,每次只移动一块盘子,且每根针上   不能出现大盘压小盘.找出移动次数最小的方案.   程序如下:   program fanta;   var   n:integer;   procedure move(n,a,b,c:integer);   begin   if n=1 then writeln(a,'--->',c)   else begin   move(n-1,a,c,b);   writeln(a,'--->',c);   move(n-1,b,a,c);   end;   end;   begin   write('Enter n=');   read(n);   move(n,1,2,3);   end.   例4 快速排序   快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1, 处理结束.   程序如下:   program kspv;   const n=7;   type   arr=array[1..n] of integer;   var   a:arr;   i:integer;   procedure quicksort(var b:arr; s,t:integer);   var i,j,x,t1:integer;   begin   i:=s;j:=t;x:=b;   repeat   while (b[j]>=x) and (j>i) do j:=j-1;   if j>i then begin t1:=b; b:=b[j];b[j]:=t1;end;   while (b<=x) and (i<j) do i:=i+1;   if i<j then begin t1:=b[j];b[j]:=b;b:=t1; end   until i=j;   b:=x;   i:=i+1;j:=j-1;   if s<j then quicksort(b,s,j);   if i<t then quicksort(b,i,t);   end;   begin   write('input data:');   for i:=1 to n do read(a);   writeln;   quicksort(a,1,n);   write('output data:');   for i:=1 to n do write(a:6);   writeln;   end.   练习:   1.计算ackerman函数值:   n+1 m=0   ack(m,n)={ ack(m-1,1) m<>0 ,n=0   ack(m-1,ack(m,n-1)) m<>0,n<>0   求ack(5,4)

知与谁同 2019-12-02 01:25:22 0 浏览量 回答数 0

问题

大神们!这个程序在没有错误,能运行,为什么一到蓝桥杯提交时间就会显示编译错误的?

a123456678 2019-12-01 19:24:10 1354 浏览量 回答数 1

问题

用javascript写的字符串加密程序,用if判断程序正常,用switch出错

小旋风柴进 2019-12-01 20:23:11 875 浏览量 回答数 1

回答

C语言版: #include "stdio.h"// #include "stdlib.h"// void main(void){ int *p,n,s,i,j,k; printf("How many people?\nn="); scanf("%d",&n); if(!(p=(int *)malloc(n*sizeof(int)))){ printf("Application memory failure...\n"); return; } for(i=0;i<n;p[i]=1+i++); printf("Count off to?\ns="); scanf("%d",&s); for(i=j=k=0;;i++){// if(i==n) i=0; if(!p[i]) continue; if(++j==s){ p[i]=j=0; if(++k==n) break; } } printf("The last one is: %d.\n",i+1); free(p); } java语言版 public static void joseph(boolean[] array) { for (int i = 0; i < array.length; i++) { array[i] = true; } int counter = 0;// 计数器 int leftCount = array.length;// 剩余人数 int index = 0;// 索引 while (leftCount > 1) { if (array[index]) { counter++; if (counter == 3) { counter = 0; array[index] = false; leftCount--; } } index++; if (index == array.length) { index = 0; } } for (int i = 0; i < array.length; i++) { if (array[i]) { System.out.println("剩余人员的位置是" + (i + 1)); } } } public static void main(String[] args) { boolean[] array = new boolean[10]; joseph(array); } C++版 #include <iostream> using namespace std; void Solution1(int *arr, int length, int m); int main() { int arr[10] = {0,1,2,3,4,5,6,7,8,9}; int m = 5; Solution1(arr,10,m); return 0; } /* simulate the process */ void Solution1(int *arr, int length, int m){ int i = 0; int index = length; int mIndex = m; while(index>1){ mIndex = m; while(mIndex > 0){ if(arr[i] != -1){ mIndex--; if(mIndex == 0) arr[i] = -1; } i = (i+1)%length; } index--; } for(i=0;i<length;i++) if(arr[i] != -1) cout<<arr[i]; }

a123456678 2019-12-02 02:18:14 0 浏览量 回答数 0

问题

数据结构顺序表C语言实现

51干警网 2019-12-01 19:40:52 1596 浏览量 回答数 5

回答

第二个嵌套的for语言里不应该是j=i+1而是j=0才对-------------------------#include <stdio.h> //简单选择排序 void SelectSort(int r[ ], int n) { int i; int j; int index; int temp; for (i=0; i<n-1; i++) //对n个记录进行n-1趟简单选择排序 { index=i; for (j=i+1; j<n; j++) //在无序区中选取最小记录 if (r[j]<r[index]) index=j; if (index!=i) { temp=r[i]; r[i]=r[index]; r[index]=temp; } } } void main() { int num[20]; int a,b,c,t; for (c=0;c<10;c++) scanf("%d",&num[c]); SelectSort(num,10);//调用用SelectSort(num,10)即可 for(c=0;c<10;c++) printf("%d ",num[c]); getch(); }

玄学酱 2019-12-02 01:18:03 0 浏览量 回答数 0

问题

C语言利用递归实现整数次幂出错

a123456678 2019-12-01 19:48:27 711 浏览量 回答数 1

问题

关于C语言getchar()

a123456678 2019-12-01 19:48:31 1099 浏览量 回答数 5

问题

C语言,数据结构,二叉树的递归构造,求大神教导,使其正常运行。

a123456678 2019-12-01 19:51:44 793 浏览量 回答数 1

问题

C语言,数据结构,二叉树的递归构造,求大神教导,使其正常运行。

a123456678 2019-12-01 19:51:10 1179 浏览量 回答数 1

问题

Leetcode Trie Tree实现问题

杨冬芳 2019-12-01 19:34:54 1012 浏览量 回答数 1

问题

Two sum C语言实现后,不知道为啥报错了!!!

a123456678 2019-12-01 19:50:58 1125 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播