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