循环结构程序问题详解.docx

上传人:b****5 文档编号:6643558 上传时间:2023-01-08 格式:DOCX 页数:11 大小:17.32KB
下载 相关 举报
循环结构程序问题详解.docx_第1页
第1页 / 共11页
循环结构程序问题详解.docx_第2页
第2页 / 共11页
循环结构程序问题详解.docx_第3页
第3页 / 共11页
循环结构程序问题详解.docx_第4页
第4页 / 共11页
循环结构程序问题详解.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

循环结构程序问题详解.docx

《循环结构程序问题详解.docx》由会员分享,可在线阅读,更多相关《循环结构程序问题详解.docx(11页珍藏版)》请在冰豆网上搜索。

循环结构程序问题详解.docx

循环结构程序问题详解

循环结构程序

1.利用随机函数RAND和函数floor,产生30个1到20之间的随机整数,使用WHILE语句显示这30个随机数。

declare@iint,@xint

select@i=1

while@i<=30

begin

set@x=FLOOR(RAND()*(20-1+1)+1)

set@i=@i+1

print@x

end

2.设纸的厚度为0.5毫米,将纸对折,再对折…,求至少对折多少次,纸张的厚度能达到珠穆朗玛峰的高度8848米。

方法一:

Declare@hdecimal(10,1),@nint

select@h=0.5,@n=0

while@h<8844000--运算部分

begin

set@h=@h*2

set@n=@n+1

end

select'对折',@n,'次后可以超过珠峰的高度‘-输出部分

方法二:

Declare@hdecimal(10,1),@nint

select@h=0.5,@n=0

while@h<8844000--运算部分

begin

set@n=@n+1

set@h=0.5*power(2,@n)

end

--select'对折',@n,'次后可以超过珠峰的高度'

print'对折'+ltrim(str(@n))+'次后可以超过珠峰的高度'

3.求自然数1~100之间奇数之和

declare@iint,@sbigint

select@i=1,@s=0

while@i<=100

begin

set@s=@s+@i

set@i=@i+2

end

select'@s=',@s

4.编写程序,输出由1、2、3、4、5、6这六个数字组成的所有可能的两位数,并统计它们的个数。

declare@xint,@iint,@jint,@nint

set@x=123456

set@i=1

set@n=0

while@i<=6

begin

set@j=1

while@j<=6

begin

printstr(@i,1)+str(@j,1)

set@n=@n+1

set@j=@j+1

end

set@i=@i+1

end

print'@n='+str(@n,3)

5.编写程序,输入一个数,判定该数是否为素数,如果是素数,则输出“该数是素数”的信息,否则输出“该数不是素数”的信息。

方法一:

用循环变量等于要判断的数减一的方法来确定。

declare@xint,@iint

set@i=2

set@x=6

while@i<=@x-1

begin

if@x%@i=0

break

else

set@i=@i+1

end

if@i=@x

printstr(@x)+‘是素数'

else

printstr(@x)+‘不是素数'

方法二:

使用做记号的方法。

declare@xint,@iint,@jhbit

set@jh=0--使用变量做记号

set@i=2

set@x=5

while@i<=@x-1

begin

if@x%@i=0

begin

set@jh=1

break

end

else

set@i=@i+1

end

if@jh=0

printstr(@x)+‘是素数'

else

printstr(@x)+‘不是素数'

6.编程计算从1到30之间的所有7的倍数之和

declare@iint,@sbigint

select@i=1,@s=0

while@i<=30

begin

if@i%7=0

set@s=@s+@i

set@i=@i+1

end

select'@s=',@s

7.在国际象棋棋盘的64个格上依次放入小麦1粒、2粒、4粒、8粒…,求按此规律放满64个格需要多少粒小麦。

分析:

后一个数是前一个数的2倍,得出通式为:

@X=2*@X

declare@xfloat,@Sfloat,@nbigint

select@x=1,@s=0,@n=1

while@n<=64

begin

set@s=@s+@x

set@x=2*@x

set@n=@n+1

print@x

end

print'@s='+cast(@sasvarchar(40))

8.求自然数1~100之间偶数之和

declare@iint,@sbigint

select@i=0,@s=0

while@i<=100

begin

set@s=@s+@i

set@i=@i+2

end

select'@s=',@s

9.计算s=1+1/2+1/4+1/7+1/11+1/16+1/22+1/29+…当第i项的值小于0.0004时结束。

提示:

找出规律,第i项的分母是前一项的分母加i减1。

declare@iint,@sfloat,@fmfloat

--@i是项数,@fm是分母,@s是所求的和值

set@i=1

set@s=0

set@fm=1

while1/@fm>0.0004

begin

set@s=@s+1/@fm

set@i=@i+1

set@fm=@fm+@i-1--第i项的分母是前一项的分母加i减1

end

print'@s='+str(@s,7,4)

print'@i='+str(@i,7,4)--查看一下第多少项时1/fm为0.0004

print'@fm='+str(@fm,7,4)--查看一下1/fm为0.0004时的fm是多少

注意:

分母(@fm)必须定义为float类型,不能定义为int,因两个整数相除商为整数而得不到小数。

10.编写程序,在100~999三位整数范围内,找出这样的数(水仙花数):

该数等于其各位数字的立方和。

如:

371=3^3+7^3+1^3,即371就是水仙花数。

注意:

3^3表示3的3次方,7^3表示7的3次方,1^3表示1的3次方。

分析:

首先要会将数进行分解,分解的方法我们讲过至少3种。

第一种,一般的分解方法:

Declare@xint,@aint,@bint,@cint,@sint

set@x=456

Set@a=floor(@x/100)--取出百位上的数字

Set@b=floor((@x-@a*100)/10)--取出十位上的数字

set@c=@x-@a*100-@b*10--取出个位上的数字

使用以上分解数的方法所编代码为:

Declare@xint,@aint,@bint,@cint

print'100-999之间的所有水仙花是:

'

set@x=100

while@x<=999

begin

Set@a=floor(@x/100)--取出百位上的数字

Set@b=floor((@x-@a*100)/10)--取出十位上的数字

set@c=@x-@a*100-@b*10--取出个位上的数字

ifpower(@a,3)+power(@b,3)+power(@c,3)=@x

print@x

set@x=@x+1

end

第二种,找通式方法:

假设@x=1234

个位=(Floor(@x/1))%10

十位=(Floor(@x/10))%10

百位=(Floor(@x/100))%10

千位=(Floor(@x/1000))%10

通式:

X(i)=FLOOR(@X/10(i-1))%10i从个位数起。

使用以上分解数的方法所编代码为:

Declare@xint,@aint,@bint,@cint

print'100-999之间的所有水仙花是:

'

set@x=100

while@x<=999

begin

Set@a=(Floor(@x/100))%10--取出百位上的数字

Set@b=(Floor(@x/10))%10--取出十位上的数字

set@c=(Floor(@x/1))%10--取出个位上的数字

ifpower(@a,3)+power(@b,3)+power(@c,3)=@x

print@x

set@x=@x+1

end

第三种,取子串的方法

Declare@xint,@aint,@bint,@cint

print'100-999之间的所有水仙花是:

'

set@x=100

while@x<=999

begin

Set@a=str(substring(cast(@xaschar(3)),1,1),1)--取出百位上的数字

Set@b=str(substring(cast(@xaschar(3)),2,1),1)--取出十位上的数字

set@c=str(substring(cast(@xaschar(3)),3,1),1)--取出个位上的数字

ifpower(@a,3)+power(@b,3)+power(@c,3)=@x

print@x

set@x=@x+1

end

提示:

代码中的cast(@xaschar(3))是将数值型的@X转换为字符型数据,之后用substring函数取子串,然后再将字符型数据用str函数转换为数值型数据。

11.计算1!

+2!

+…+20!

方法一:

使用双循环即循环嵌套来实现。

declare@s1float,@S2float,@iint,@jint

set@i=1

set@s1=0

while@i<=4

begin

set@j=1

set@s2=1

while@j<=@i

begin

set@s2=@s2*@j

set@j=@j+1

end

printstr(@j-1,2)+'!

='+ltrim(str(@s2))

set@s1=@s1+@s2

set@i=@i+1

end

print'1!

+2!

+3!

+...的和@s1='+cast(@s1asvarchar(40))

方法二:

使用单循环也可实现。

declare@s1float,@S2float,@iint,@jint

set@i=1

set@s1=0--用来存放和值

set@s2=1--用来存放阶乘值

while@i<=4

begin

set@s2=@s2*@i

set@s1=@s1+@s2

set@i=@i+1

end

print'1!

+2!

+3!

+...的和@s1='+cast(@s1asvarchar(40))

类似的题目还有:

s=1+(1+2)+(1+2+3)+(1+2+3+4)+….+(1+2+#+…+n),模仿上例自己编程实现。

12.利用循环结构求s的值,S=1*2*3+2*3*4+…+i*(i+1)*(i+2)+…+15*16*17的值。

declare@s1float,@S2float,@iint,@jint

set@i=1

set@s1=0--用来存放和值

set@s2=1--用来存放乘积

while@i<=3

begin

set@s2=@i*(@i+1)*(@i+2)

set@s1=@s1+@s2

set@i=@i+1

end

print'1*2*3+2*3*4+…+i*(i+1)*(i+2)+…+15*16*17的和@s1='+cast(@s1asvarchar(40))

13.有一个分数序列,求出这个序列的前20项之和。

2/1,3/2,5/3,8/5,13/8,21/13,….提示:

后一项是前一项的倒数加1。

declare@sfloat,@xfloat,@iint

set@i=1

set@s=0--用来存放和值

set@x=2/1

while@i<=3

begin

set@s=@s+@x

set@i=@i+1

set@x=1/@x+1--后一项是前一项的倒数加1

end

print'2/1,3/2,5/3,8/5,13/8,21/13的前20项的和@s='+cast(@sasvarchar(40))

14.计算1^3+2^3+3^3+…+100^3.注意:

1^3表示1的3次方,2^3表示2的3次方,…,100^3表示100的3次方。

declare@sbigint,@iint

set@i=1

set@s=0--用来存放和值

while@i<=100

begin

set@s=@s+power(@i,3)

set@i=@i+1

end

print'1^3+2^3+3^3+…+100^3的和@s='+cast(@sasvarchar(40))

15.编写程序,用Print语句显示1~50之间的奇数

declare@iint

print'显示1~50之间的奇数'

set@i=1

while@i<=50

begin

print@i

set@i=@i+2

end

16.求s=a+aa+aaa+…+aaa…aaa(n个a),其中a和n的值由用户使用Set或Select语句自己输入。

例如,当a=3,n=4时,S=3+33+333+3333。

方法一:

用重复产生字符函数REPLICATE编程:

declare@iint,@avarchar(10),@sbigint

print'求a+aa+aaa+…+aaa…aaa(n个a)的和'

set@s=0

set@i=1

set@a='5'

while@i<=4

begin

set@a='5'

set@a=replicate(@a,@i)

print@a

set@s=@s+cast(@aasint)

set@i=@i+1

end

print'求a+aa+aaa+…+aaa…aaa(n个a)的和@s='+ltrim(str(@s,15))

方法二:

按位权展开法

如X=123按位权展开法得到结果为:

X=1*102+2*101+3*100,可得通式为

X=X+Floor(((a/10^(i-1)))%10)*10^(i-1)

说明:

公式中的Floor(((a/10^(i-1)))%10),是把每一个数分离出来的通式。

由于该题每一个数位都相同,因此通式可写为

X=X+a*10(i-1)

declare@iint,@xbigint,@aint,@sbigint

print'求s=a+aa+aaa+…+aaa…aaa(n个a)的和'

set@s=0

set@i=1

set@a='5'

set@x=0

while@i<=4

begin

set@x=@x+@a*power(10,@i-1)

print@x

set@s=@s+@x

set@i=@i+1

end

print'求a+aa+aaa+…+aaa…aaa(n个a)的和@s='+ltrim(str(@s,15))

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1