输入几个无重复的字母,将这几个字母的全排列输出出来.比如输入a,b,c,会输出"abc,acb,bac,bca,cba,cab,

输入几个无重复的字母,将这几个字母的全排列输出出来.比如输入a,b,c,会输出"abc,acb,bac,bca,cba,cab,,第1张

#include<stdioh>

#include<stdlibh>

#define N 5

int a[120][N];//a[line][N]

int get_line(int n)

{

int line=n;

while(--n)

line=linen;

return line;

}

void exchange(int num)

{

int rand_N0,rand_N1,t;

rand_N0=rand()%N;

rand_N1=rand()%N;

t=a[num][rand_N0];

a[num][rand_N0]=a[num][rand_N1];

a[num][rand_N1]=t;

}

int campar(int num0,int num1)

{

int i,times=0;

for(i=0;i<N;i++)

if(a[num0][i]==a[num1][i])

times++;

return times;

}

void main()

{

int i,j,num=0,line,clash=0;

line=get_line(N);

for(i=0;i<line;i++)

for(j=0;j<N;j++)

a[i][j]=j+'a';

while(num<line){

if(clash)

clash=0;

else

{

printf("the %3d line is ",num);

for(i=0;i<N;i++)

printf(" %c ", a[num][i]);

printf("\n");

num++;

}

exchange(num);

for(i=0;i<num;i++){

if(campar(num,i)==N)

clash=1;

}

}

}

像for(int i=0;i<n;i++)c语言里变量定义不能这样吧。要把int定义前面的吧。把所有变量定义改了,用C-Free程序运行是正常的。

#include <stdioh>

#define N 10

swap(int p,int q)

{

int temp;

temp=p;

p=q;

q=temp;

}

sort(int a[],int k,int n)

{ int temp1,temp2,j,i;

if(k==n)

{

for( i=0;i<=n;i++)

printf("%d",a[i]);

printf("\n");

}

else{

for(j=k;j<=n;j++)

{

swap(&a[k],&a[j]);

sort(a,k+1,n);

swap(&a[k],&a[j]);

}

}

}

main()

{

int a[N];

int n,i;

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

sort(a,0,n-1);

}

using System;

namespace ConsoleApplication1

{

class Program

{

public static int[] Nums;

static void Main(string[] args)

{

Nums = new int[] { 1, 2, 3, 4, 5 };//这里可以放你的变量例如Nums = new int[] { a, b, c, d, e };赋值前确保变量有值。

Permutation(Nums, 0, NumsLength);

ConsoleReadKey();

}

/// <summary>

/// 递归实现全排序并输出

/// </summary>

/// <param name="nums">待排序的字符数组</param>

/// <param name="m">输出字符数组的起始位置</param>

/// <param name="n">输出字符数组的长度</param>

public static void Permutation(int[] nums, int m, int n)

{

int i, t;

if (m < n - 1)

{

Permutation(nums, m + 1, n);

for (i = m + 1; i < n; i++)

{

t = nums[m];

nums[m] = nums[i];

nums[i] = t;

//

Permutation(nums, m + 1, n);

//

t = nums[m];

nums[m] = nums[i];

nums[i] = t;

}

}

else

{

for (int j = 0; j < numsLength; j++)

{

ConsoleWrite(nums[j]);

}

ConsoleWriteLine();

}

}

}

}

 s = input('任意输入n个不重复的整数序列(如:12,13,15,1)\n','s');

A = str2num(s);

m = length(A);

id = perms(1:m);

R = A(id)

任意输入n个不重复的整数序列(如:12,13,15,1)

5,12,1

R =

   1    12     5

   1     5    12

  12     1     5

  12     5     1

   5    12     1

   5     1    12

和一般的int[]的全排列,同样道理的

可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

c语言编程全排列

一、 引入:

fpc-200i386-win32

程序一:已知长方形的长、宽,求长方形的周长

program circle; 该程序的首部,program是保留字

var chang,kuan,zhouchang:real; 定义变量:设定长,宽,周长为实数类型

begin 开始语句

readln(chang); 读语句,读入长(chang)和宽(kuan)

readln(kuan);

zhouchang:=2(chang+kuan); 赋值语句,将计算结果赋给zhouchang

write(zhouchang); 写语句,将结果(zhouchang)

end 结束语句,与begin成对出现

程序二:已知长方形的长、宽,求长方形的周长,并求出长方形的面积。

rogram circle;

var chang,kuan,zhouchang,mianji:real;

begin

readln(chang);

readln(kuan);

zhouchang:=2(chang+kuan);

mianji:=changkuan;

write(zhouchang,mianji);

end

小结:一个完整的pascal程序结构

Program 程序名(程序参数表);

var

变量说明;

Begin

语句;

语句;

……

End

编译:Alt+F9

运行 Ctrl+F9

返回看结果Alt+F5

思考练习:

1、已知长方体的长、宽、高,求长方体的表面积及体积。

2、已知正方体的边长,求正方体的表面积及体积。

3、已知圆半径,求圆的周长及面积。

作业

已知圆半径,求圆的周长及面积。314若改成314159

第一句为程序首部,每个pascal程序都必须以它开头。

增加程序的可读性,用pi表示

一、常量说明

Const pi=314159

变量说明

VAR 单个变量或用逗号分开的多个变量

<变量表>:<类型>

二、标准数据类型

(一)、实型(real)

1、两种表示方法:小数表示法和指数表示法

小数表示法:125,00025,2582,2530

科学表示法:125e0,13654e+2,25e-3,

0e0,1e2

2、说明方式

const k=126

var m,n:real;

3、运算:+(加),—(减),(乘),/(除)

标准函数:

abs(绝对值),sqr(平方),sqrt(开方),

trunc(取整),round(舍入取整)

(二)、整型(integer)

1、表示方法:25,-456,0

2、说明方法:

const long=150;

wide=65;

var I,j,k:integer;

3、整型量的运算:

+(加),—(减),(乘),div(整除)

/(除)得到的值为实型,mod(取余) 4、用于整数的标准函数

abs(绝对值),sqr(平方),pred(前导)

succ(后续),

三、

读语句一:read

用于在程序执行时,从外部输入数据给变量

一般形式:read(变量表) 其中变量表是一些由逗号分开的变量

程序一、读入2个整数和1个实数,并将这三个数输出。

Program shu;

Var

x,y:integer;

z:real;

begin

read(x);

read(y);

read(z);

write(x);

write(y);

write(z);

end Program shu;

Var

x,y:integer;

z:real;

begin

read(x,y,z);

write(x,y,z);

end

可以将读入与写出语句合并成一句。

注意:从键盘上输入的数据必须与程序中设定的输入变量的类型相同。例如上题,x,y是整型,我们从键盘上输入就必须是整型数,例如:14、-6,而不能是实型数,例如:19、980;而z是实型数,输入可以是小数也可以是整数,例如:236666 ,或者是10。

读语句二:readln

在完成该语句的最后一个变量值的输入以后,将结束包括这个数据值的输入行,使下一个read语句(或readln语句)从下一个新行开始输入数据。

例:

Program shu2;

Var a,b:real;

begin

Read(a,b);

Read(c,d,e,f);

Read(g,h);

Writeln(a,b,c,d,e,f,g,h);

End Program shu2;

Var a,b:real;

begin

Readln(a,b);

Readln(c,d,e,f);

Readln(g,h);

Writeln(a,b,c,d,e,f,g,h);

End

从键盘上输入以下数据:

15 37 24

57 21 89

92 17 53

28 34 29

得到的结果:

a=15 b=37

c=24 d=57 e=21 f=89

g=92 h=17 得到的结果:

a=15 b=37

c=57 d=21 e=89 f=92

g=28 h=34

四、表达式与赋值语句

一般形式:<变量>:=<表达式>

表达式可以是简单的常数、常量、变量、函数或它们之间的算术运算、逻辑运算、关系运算等

例如:2+3x

125×10-5

写表达式时,要注意以下几点:

1、所有表达式必须以线形写出。

2、只能使用合法的标志符

3、乘号必须用符号“”明确地指出,不得省略

4、函数的自变量可以是任意表达式。

注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。

(1)、表达式的类型与左端变量的类型相同

(2)、表达式为整型,左端变量为实型

var I,j,k:integer

k:=I/j

X:=x+1 I:=I+1

写语句一:Write语句

将计算结果通过屏幕或打字机输出显示。

例如:write(aa,bb);

一般形式:write(<输出表>:场宽:小数位数)

输出表是一些由逗号分开的输出项。

输出项可以是变量或表达式,或用引号括起来的字符串。

若为变量,则输出变量的值。

若为表达式,则先计算表达式的值,然后将值输出。

若为字符串,则输出字符串本身。

若为用符号’ x+y= ’ ,则将单引号内的值原样输出

例如:输入:x=5,y=6

write(x,y,x+y,xy)

输出结果:5,6,11,30

write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’xy=‘,xy);

输出结果:x=5y=6x+y=11xy=30

写语句二:Writeln语句

结果将输出在不同的行上。

在印出输出表的最后一个输出项后,结束当前输出行,使得下一个write(或writeln)语句从下一个新行的开头输出。即:印出输出项后,回车换行,光标移到下一行的首位。

例如:

Writeln 可以单独使用,用于结束当前输出行,指向下一行的开始

writeln(‘x=‘,x,’y=‘,y);

Writeln(’x+y=‘,x+y,’xy=‘,xy);

例:

1、写一程序读入三角形的三个边a,b,c,计算并输出三角形的面积S。可利用下列公式计算:S= ,其中p= 。

2、输入一个三位整数,将它反向输出。例如输入127,输出应为721。

常量说明,不一定要有

三、字符型

1、表示方法: ‘A’,’B’,’C,’,…… ‘a’,’b’,’c’,…… ‘0’,’1’,’2’,’3’,…… ‘+’,’-’,’’,…… ‘’代表空格字符

2、说明方法

const black=‘’ star=‘’ var ch1,ch2:char;

3、用于字符的标准函数

ord(取序号),pred(前导),succ(后继)

chr(65)=‘A’ chr(97)=‘a’ ord(‘A’)=65 ord(‘a’)=97

四、布尔型(boolean)

1、说明

const f=false;

t=true;

var b1,b2,flag:boolean;

2、标准函数

odd(取序号)、pred(前导)、succ(后继)、

odd(false)=0 odd(true)=

pred(true)= succ(false)=

3、用于布尔量运算有布尔逻辑运算(即逻辑运算)

AND(与)OR(或) NOT(非)

B1 B2 NOT B1 B1 AND B2 B1 OR B2

FALSE FALSE

FALSE TRUE

TRUE FALSE

TRUE TRUE

4、关系运算

<(小于),<=(小于等于),=(等于)

>(大于),>=(大于等于),<>(不等于)

关系运算可以用于整型、实型、字符型、布尔类型。

结果均为布尔型

例:3<6=

3<78=

false<true=

‘a’>=‘b’=

判断(x,y)是否在第一象限

6、表达式按下列运算优先规则计算

(1)、所有括起来的子表达式必须首先计算,且子表达式必须从里到外计算。

(2)、在同一表达式中的运算符按下列次序计算:

①函数

②not

③AND,,/,DIV,MOD

④OR,+,-

⑤<,<=,=,>,>=,<>

(3)、同一个表达式中,同一优先级按从左到右注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。

a、表达式的类型与左端变量的类型相同

b、表达式为整型,左端变量为实型

var I,j,k:integer

k:=I/j

X:=x+1 I:=I+1

Write语句

将计算结果通过屏幕或打字机输出显示。

例如:write(aa,bb);

一般形式:write(<输出表>:场宽:小数位数)

输出表是一些由逗号分开的输出项。

输出项可以是变量或表达式,或用引号括起来的字符串。

若为变量,则输出变量的值。

若为表达式,则先计算表达式的值,然后将值输出。

若为字符串,则输出字符串本身。

若为用符号’ x+y= ’ ,则将单引号内的值原样输出

例如:输入:x=5,y=6

write(x,y,x+y,xy)

输出结果:5,6,11,30

write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’xy=‘,xy);

输出结果:x=5y=6x+y=11xy=30

1、 输入三个字符,然后按输入字符次序输出这三个字符,再输出每个字符的序号,最后按与输入字符相反的次序输出这三个字符。

2、 输入两组x,y值,由程序根据它们是否在斜线区域内,输出不同的值。若在斜线区域内,输出true,否则输出false。

三、选择结构程序设计

程序一:期末成绩,如果成绩在60分以上的为合格,60分以下的为不及格,如何表示

program pd;

var

x:real;

begin

read(x); 读入成绩

if x>=60 then write(‘pass’)

else write(‘not pass’); 用if语句进行判断,如果>=60打印“pass ” 否则打印“not pass”

End

选择结构语句一:If语句格式

IF语句格式1:IF〈条件〉THEN 〈语句1〉

ELSE 〈语句2〉

IF语句格式2:IF〈条件〉THEN 〈语句1〉

程序二:火车托运行李,要根据重量按不同的标准收费。例如不超过50kg,按每公斤035元收费。若超过50k按每公斤035元收费,其余超过部分按每公斤050远收费。现输入托运行李重量,要求计算并输出托运费。

Program compay;

var

weight,pay:real;

begin

readln(weight); 读入行李重量

if weight<=50 then pay:=weight035 判断语句

else pay:=50035+(weight-50)05;

Writeln(‘pay=‘,pay); 打印付费结果

end

注意:If语句中,如果<语句一>或者<语句二>,执行的内容无法用一个语句实现,可以使用复合语句,用begin 和end将执行的语句合并成一个复合语句。

复合语句格式:BEGIN

〈语句1〉;

〈语句2〉;

……;

END;

程序三:输入一个数字,如果该数字大于100,则先输出这个数,并将该数减去100,并将减去100后的结果输出,否则输出“no”。

Program number;

Var x,y:real;

Begin

read(x); 读入该数x

If x>100 then 对x进行判断

Begin 用begin和end将三个语句合并成一个复合语句

writeln(x);

x:=x-100;

writeln(x);

end

else writeln(“no”);

End

复合判断条件语句:当<条件>中包含的不仅只有一个语句,而是多个条件时,可以使用and\or\not复合判断条件

AND:与、和 ,条件都成立时为真

OR:或者,只要有一个条件成立时为真

NOT:非,

程序四:输入一个成绩,如果该成绩小于90并且大于等于70,则输出“ok”

程序:Program score;

var k:real;

begin

read(k);

if (k>=70) and (k<90) then write(‘ok’);

end

复合IF语句

程序五、输入某学生成绩,若成绩在85分以上,输出“A”,若成绩在60分到85分之间,包含60和85,输出“B”,若成绩低于60分,输出“C”。

该题有三重判断,如何实现?

应用复合IF语句:

read(成绩)

IF 成绩>85 then write(’A’) 第一重IF

Else if 成绩>=59 then write (‘B’) 第二重IF

Else write(‘C’);

复合IF语句格式:

IF〈条件1〉 THEN 〈语句1〉

ELSE IF〈条件2〉 THEN〈语句2〉

ELSE〈语句3〉

If语句练习题:

1、 从键盘上输入一个正整数,判断奇数、偶数。如果为奇数则输出“YES”,如果为偶数则输出“NO”。

2、 读入两个数,找出其中最大的数,并输出。

3、 输入一个数,判断该数是正数、负数还是零,为正数输出“zheng”,为负数输出“fu”,为零输出“0”。

Program circle;

Var num:integer;

Begin

Read(num);

If num>0 then writeln(‘zheng’)

Else if num<0 then writeln(‘fu’)

Else writeln(‘0’);

End

4、 对一批货物征收税收。价格在1万元以上的货物征税5%,在5000元以上,1万元以下的货物征税3%,5000元以下的货物征税2%,1000元以下的货物免税。编一程序,读入货物价格,计算并输出税金。

Program test;

Var price,tax:real;

Begin

Read(price);

If price>=10000 then tax:=price005

Else if price>=5000 then tax:=price003

Else if price>=1000

then tax:=price002

Else tax:=0;

Writeln(‘tax=’,tax);

End

5、 输入一个数,如果这个数能同时满足用3除余2,用5除余3,用7除余2的所有整数,则输出“yes”。

Program sum;

Var a:integer;

Begin

If (a mod 3=2) and (a mod 5=3) and (a mod 7=2) then write(‘yes’);

End

6、输入3个字母,按字母表顺序从小到大输出这3个字母。

7、读两个数将大数存于X,小数存于Y。

8、输入一个年份,判断是否是闰年,如果是则输出“yes”,否则输出“no”

目前公认的闰年判断算法,满足下列二者之一,即为闰年:

① 能被4整除,但不能被100整除

② 能被4整除,且能被400整除

9、输入一个加减式,根据输入的式子,判断运算符号,求出结果。例如从键盘上输入:+,5 , 3,则输出为8;例如输入:-,10 , 6,则输出为5。

10、输入一个1000以内的任意一个数,如果这个数中至少有一位数字是5,则输出“yes”,否则输出“no”。

11、输入一个三位的数,判断该数是否为水仙花数,是则输出“flower”。(水仙花数:若三位数abc,a^3+b^3+c^3=abc ,则称该数为水仙花数)

12、输入一个1000以内的数,判断该数是否为守行数(若某数的平方,其低位与该数本身相同,则称该数为守行数。例如25,252=625,62=36,平方值的低位与原数相同,25、6为守行数)。

选择结构语句二:CASE语句:是实现选择结构程序设计的另一种语句。

程序一:输入班号,输出该班学生人数。

班号: 1 2 3 4 5 6

人数: 50 52 50 50 52 55

使用IF语句:

Program number;

Var x:integer;

Begin

Read(x);

If (x=1) or (x=3) or (x=4) then write(50)

Else if x=6 then write(55)

Else write(52);

End

使用CASE语句:

Program number;

Var x:integer;

Begin

Read(x);

Case x of

1, 3, 4:write(50);

6 :write(55);

2, 5 :write(52);

end

end

CASE语句的一般形式是:

CASE <表达式> OF 表达式:必须是有序类型(整型、字符型、布尔型)

<值表1>:<语句1>; 值表1:为具体的值列表,用逗号隔开

<值表2>:<语句2>;

……

<值表n>:<语句n>

END

练习:

1、输入年、月,输出该月有几天。(每年的1、3、5、7、8、10、12,每月有31天;4、6、9、11月,每月有30天;2月闰年有29天,平年有28天。年号能被4整除,但不能被100整除,或者年号能被400整除的年份均是闰年)

2、输入两个运算量及一个运算符(+,-,,/),输出运算结果。

例如:输入 6 9 +

输出 15

3、若已知x在1到8之间,要按如下公式计算y。

y=

4、 输入实数x(已知0<=x<=10),计算y并输出。

2x2+3x+5 x<3

y= (x-3)2 3<=x<6

x>=6

用两种方法编程:

(1) 用IF语句编程;

(2) 用CASE语句编程

<循环体>

循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值小于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动加1(即后继值)赋给循环变量,然后再与终值比较,如果与(终值+1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值+1)相等。

注意:

1、循环变量必须是有序类型的,且必须与初值与终值的类型相同,例如:整数,字符,而不能是实型。

2、循环变量的初值、终值可以是表达式。

3、循环体可以是任何单个语句或由多个语句组成的复合语句(begin……end)。

4、在循环体内不要随意改变循环变量的值,否则可能会造成死程序循环。

3、 在循环体中,对初、终值表达式值的改变不会影响循环次数及循环变量的取值。

FOR <循环变量>:=<初值> to <终值> do

<循环体>

循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值大于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动减1(即前导值)赋给循环变量,然后再与终值比较,如果与(终值-1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值-1)相等。

例题二:在1——500中,找出能同时满足用3整除余2,用5整除余3,用7整除余2的所有整除,打印出来。

程序二:

program sunzi;

var I:integer; 仅需一个变量i

begin

for I:=1 to 500 do 直接利用循环变量,对其进行判断

if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then write(I);

end

例题三:例题二改进:找出满足条件的数打印出,并统计其个数,最后将总个数打印出来。

程序三:program sunzi;

var I,num:integer;

begin

num:=0; 利用变量num统计符合条件的个数,初始化num=0

for I:=1 to 500 do

if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then

begin write(I);

num:=num+1; 符合条件时,记数自动累加1

end;

writeln(num); 500次判断后将计算结果打印出来

end

多重循环概念:

如果一个循环结构的内部(循环体)又包括一个循环结构,就称为多重循环结构。

注意:多重循环的嵌套次数可以是任意的。可以按照嵌套层次数,分别叫做二重循环、三重循环等。处于内部的循环叫做内循环,处于外部的循环叫做外循环。

练习:

1、打印如下图形:

(1) (2) (3) (4) (5)

(6) (7) (8) (9) (10)

2、打印出如下图形:

1

12

123

1234

12345 1

2 2 2

3 3 3 3 3

4 4 4 4 4 4 4 1

2 3 4

5 6 7 8 9

10 11 12 13 14 15 16

17 18 19 20 21 22 23 24 25

A

AB

ABC

ABCD

ABCDE A

A B

A B C

A B C D

……

A B C …… Z 1

1 2 1

1 2 3 2 1

1 2 3 4 3 2 1

1 2 3 4 5 4 3 2 1

3、打印杨辉三角形

一、WHILE循环

对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句或repeat语句实现循环要更方便。

while语句的形式为:

while <布尔表达式> do <语句>;

其意义为:当布尔表达式的值为true时,执行do后面的语句。

while语句的执行过程为:

①判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;

②执行循环体语句(do后面的语句);

③返回步骤1;

④结束循环,执行while的下一个语句。

说明:这里while和do为保留字,while语句的特点是先判断,后执行。 当布尔表达式成立时,重复执行do后面的语句(循环体)。

例1 、求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。

分析:“恰好使s的值大于10”意思是当表达式s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。从数学角度,我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。

程序如下:

var

s : real;

n : integer;{n表示项数}

begin

s:=00;n:=0;

while s<=10 do{当s的值还未超过10时}

begin

n:=n+1;{项数加1}

s:=s+1/n;{将下一项值累加到s}

end;

writlen('n=',n);{输出结果}

end

例2、求两个正整数m和n的最大公约数。

分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法:

分别用m,n,r表示被除数、除数、余数。

①求m/n的余数r

②若r=0,则n为最大公约数若r≠0,执行第③步

③将n的值放在m中,将r的值放在n中

④返回重新执行第①步。

程序如下:

program ex4_4;

var m,n,a,b,r:integer;

begin

write('Input m,n:');

readln(m,n);

a:=m;b:=n;r:=a mod b;

while r<>0 do

begin

a:=b;b:=r;

r:=a mod b;

end;

writeln('The greatest common divide is:',b:8);

end

二、直到循环(REPEAT-until语句)

用while语句可以实现“当型循环”,用repeat-until 语句可以实现“直到型循环”。repeat-until语句的含义是:“重复执行循环,直到指定的条件为真时为止”。

直到循环语句的一般形式:

Repeat

<语句1>;

:

<语句n>;

until <布尔表达式>;

其中Repeat、until是Pascal保留字,repeat与until之间的所有语句称为循环体。

说明:

①repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。

②repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句。

③repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来, repeat 和until已经起了begin和end的作用。while循环和repeat循环是可以相互转化的。

对于例2中求两个正整数的最大公约数,程序可用repeat-until循环实现如下:

var

m,n,a,b,r : integer;

begin

write('Input m,n=');

readln(m,n);

a:=m;b:=n;

repeat

r:=a mod b;

a:=b;b:=r;

until r=0;

writeln('The greatest common divide is',a);

end

以上我们已介绍了三种循环语句。一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法使用for循环时才用while循环和repeat-until循环, 而且 while 循环和repeat-until循环是可以互相替代的。for 循环在大多数场合也能用whiel和repeat-until循环来代替。

一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。

当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。

三、循环结构程序设计

例3 求1!+2!+…+10!的值。

分析:这个问题是求10自然数的阶乘之和,可以用for 循环来实现。程序结构如下:

for n:=1 to 10 do

begin

①N!的值àt

②累加N!的值t

end

显然,通过10次的循环可求出1!,2!…,10!,并同时累加起来, 可求得S的值。而求T=N!,又可以用一个for循环来实现:

t=1;

for j:=1 to n do

t:=tj;

因此,整个程序为:

program ex4_5;

var t,s:real;

i,j,n:integer;

begin

S:=0;

for n:=1 to 10 do

begin

t:=1;

for j:=1 to n do

t:=tj;

S:=S+t;

end;

writeln(‘s=’,s:0:0);

end

以上的程序是一个二重的for循环嵌套。这是比较好想的方法,但实际上对于求n!,我们可以根据求出的(n-1)!乘上n即可得到,而无需重新从1再累乘到n。

程序可改为:

program ex4_5;

var t,s:real;

i,j,n:integer;

begin

S:=0;t:=1;

for n:=1 to 10 do

begin

t:=tn;

S:=S+t;

end;

writeln(‘s=’,s:0:0);

end

显然第二个程序的效率要比第一个高得多。第一程序要进行1+2+…+10=55次循环,而第二程序进行10次循环。如题目中求的是1!+2!+…+1000!,则两个程序的效率区别更明显。

直接可以运行

没有用任何难的技术

#include <iostream>

using namespace std;

int x;

int array;

void Arrange( int arr, int len )

{

if( len == 1 )

{

for( int i = 0; i < x; i++ )

{

cout << array[i] << " ";

}

cout << endl;

return ;

}

Arrange( arr + 1, len - 1 );

for( int j = 1; j < len; j++ )

{

int temp = arr[0];

arr[0] = arr[j];

arr[j] = temp;

Arrange( arr, len - 1 );

}

}

void main()

{

cin >> x;

array = new int[x];

for( int i = 0; i < x; i++ )

{

array[i] = i + 1;

}

Arrange( array, x );

}

以上就是关于输入几个无重复的字母,将这几个字母的全排列输出出来.比如输入a,b,c,会输出"abc,acb,bac,bca,cba,cab,全部的内容,包括:输入几个无重复的字母,将这几个字母的全排列输出出来.比如输入a,b,c,会输出"abc,acb,bac,bca,cba,cab,、C语言求全排列、C#全排列等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10162834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存