《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解Word下载.docx
《《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解Word下载.docx》由会员分享,可在线阅读,更多相关《《c语言程序设计教程》林芳易云飞版第五章循环结构例题练习题详解Word下载.docx(63页珍藏版)》请在冰点文库上搜索。
scanf("
%d"
&
n);
//限制数的大小
if(n<
0||n>
12)
printf("
你输入错误!
\n"
if(n==0||n==1)
此数的阶乘为1\n"
//求当n大于一时的阶乘!
if(n>
1&
&
n<
=12)
{
for(i=2;
i<
=n;
i++)
{
sum*=i;
}
%d!
=%d\n"
n,sum);
}
}
#endif
/***********************************************************************************************
请输入要求什么数的阶乘
12
12!
=479001600
Pressanykeytocontinue
*************************************************************************************************
13
****************************************************************************************************/
/**********************************************第二个函数利用数组求大数阶乘!
*******************************/
/*******************************************************************************************************
重点!
要将数组中的每一位元素都乘以2到n的数;
规范数组元素,看每位数组元素保留几位数;
在规范中,如何计算进位?
解决:
用数组元素整除位数加一的最小数例如:
保留3位,就要用数组元素整除1000;
123/1000=0,进位为0
1234/1000=1,进位为1;
如何保证每位数组元素有一定的位数?
用数组元素整除位数加一的最小数求余如:
保留3位123%1000=123;
1234%1000=234;
当有进位时,数组下标要加一;
如何判断有进位?
当当前的下标元素加一的数组元素>
零时,说明有进位;
正确输出(要逆序输出数组,从右向左);
例如:
7!
=5040假如每位数组元素保留3位数则在数组中7!
的表示法为40/5(为了方便看每位数组元素用/隔开)
由上知数组逆序输出,因为产生的进位都会加到数组的下一位;
由上可以看到如果按上面的逆序输出得到的是540,少了一个零,为了保证零的不缺失,所以输出时除了最高位的都要用
03d%保证三位,不足三位的在左边补零。
(最高位用不到补零,如果补上的话就成了005040这样不符合我们的常规看法,当然这样也不错)
#if0
{
unsignedlonga[10000]={0};
intn,i,j,k,carry,val;
do
//为了下一次计算的正确,必须循环一次初始化一次
val=0;
a[0]=1;
//请求用户输入要求数的阶乘
请输入要求阶乘的数:
输入结束!
scanf("
//判断输入的值是不是合法n必须大于等于0
if(n<
0)
printf("
输入错误!
continue;
//当n等于一或等于0时01的阶乘都为1,,当用户输入0时,输出0的阶乘,并退出do{}whie(n!
=0)循环;
elseif(n==1||n==0)
printf("
=1\n"
n);
//当n大于一的情况
else
{
for(i=2;
i++)//此循环来控制从2乘到n
{
for(j=0;
j<
=val;
j++)//此循环来控制数组中的每个元素都乘以2-n
{
a[j]*=i;
}
for(k=0;
k<
k++)//用来规范数组中的元素,每个数组元素是一个5位数
carry=a[k]/100000;
//carry为进位,要加到k+1位
a[k]%=100000;
//每个元素保留5位数
a[k+1]+=carry;
//将进位加到下一位
if(a[val+1]>
0)//如果产生的进位大于零,就是有进位,就把下标加一
val++;
}
}
//将数组逆序输出
%5d"
a[val]);
a[val]=0;
//为了保证下次的计算,数组元素要清零
for(k=val-1;
k>
=0;
k--)
%05d"
a[k]);
//%05d是为了保证数组元素是一个5位数,并且0保证了不丢失数组元素中左边的零
a[k]=0;
//每输出一位,每一位数组元素就清零
}while(n!
=0);
/*************根据上面所求的100和1000的阶乘结果**************************************
100
933262154439441526816992388562667004907159682643816214685929638952175999932299
156********976156518286253697920827223758251185210916864000000000000000000000000
1000
402387260077093773543702433923003985719374864210714632543799910429938512398629
020*********
74245040870737599188236277271887325197795059509952761208749754624970436014182780
94646496291056393887437886487337119181045825783647849977012476632889835955735432
51318532395846307555740911426241747434934755342864657661166779739666882029120737
91438537195882498081268678383745597317461360853795345242215865932019280908782973
08431392844403281231558611036976801357304216168747609675871348312025478589320767
16913244842623613141250878020800026168315102734182797770478463586817016436502415
36913982812648102130927612448963599287051149649754199093422215668325720808213331
86116811553615836546984046708975602900950537616475847728421889679646244945160765
35340819890138544248798495995331910172335555660213945039973628075013783761530712
77619268490343526252000158885351473316117021039681759215109077880193931781141945
45257223865541461062892187960223838971476088506276862967146674697562911234082439
20816015378088989396451826324367161676217916890977991190375403127462228998800519
54444142820121873617459926429565817466283029555702990243241531816172104658320367
86906117260158783520751516284225540265170483304226143974286933061690897968482590
12545832716822645806652676995865268227280707578139185817888965220816434834482599
32660433676601769996128318607883861502794659551311565520360939881806121385586003
01435694527224206344631797460594682573103790084024432438465657245014402821885252
47093519062092902313649327349756551395872055965422874977401141334696271542284586
23773875382304838656889764619273838149001407673104466402598994902222217659043399
01886018566526485061799702356193897017860040811889729918311021171229845901641921
06888438712185564612496079872290851929681937238864261483965738229112312502418664
93531439701374285319266498753372189406942814341185201580141233448280150513996942
90153483077644569099073152433278288269864602789864321139083506217095002597389863
55427719674282224875758676575234422020757363056949882508796892816275384886339690
99598262809561214509948717012445164612603790293091208890869420285106401821543994
57156805941872748998094254742173582401063677404595741785160829230135358081840096
99637252423056085590370062427124341690900415369010593398383577793941097002775347
20000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000
0!
=1
1
**************************************************************************************/
例2
/************************************************************************
将键盘输入的一串字符显示在屏幕上,遇到字符‘*’时终止(用while循环来实现)
设计;
2012-03-0523:
48
*********************************************************************************/
/**********************************************************************************************************************
哈!
在下面还有另一种实现方法,感兴趣的可以看看啊!
(当然还有其他方法,在这就不一一介绍啦,,可以自己去发掘啊!
******************************************************************************************************************/
/****第一种方法用while来实现****************************************/
charch;
请输入字符\n"
ch=getchar();
while(ch!
='
*'
%c"
ch);
//*********1
ch=getchar();
//**********2
/*******************当把1放在2的上面的时候输出的结果如下**************
请输入字符
sds
sddd*
sddd
//*********************************当把1放在2的下面的时候输出结果如下**********************
sdsd
dsd
sdsff*
***********************************************************************/
//***************第二中方法****************************
intch;
loop:
//用goto语句实现循环
if(ch!
gotoloop;
/************************************************************
请输入字符
sfse
er
ssfd/*
ssfd/Pressanykeytocontinue
/*************************************************************/
例3
/******************************************************************************
输入某门课程的若干名同学的成绩,以-1作为结束输入的标志,计算该门课程的平均成绩。
2012-03-0610:
10
**************************************************************************/
/*************************************先分析下课本上的例题,哈!
这题有问题啊!
可以看下面改的代码,虽用while也能改,但用惯了do{}while()*************/
/***********************可以自己尝试用while来改啊!
**********************************************/
intn=0;
floatscore,sum=0;
//要求用户输入成绩!
请输入成绩按-1结束\n"
%f"
score);
//判断取值是不是合法,可惜只能判断一次
if(score==-1||score<
0)
错误数据\n"
if(score>
0)//只能判断第一次输入的值,而不能在判断第二次,因此运算时会产生错误
while(score!
=-1)//问题:
当在循环时,用户输入不是-1的负数时,会产生怎样的结果?
由下面的第二部分可知;
明显是错误的结果;
sum+=score;
n++;
scanf("
//输出平均值,没有学生个数,总分,即使错了,用户也很难发觉
平均值为%g\n"
sum/n);
/**************第一部分**************************
请输入成绩按-1结束
23
45
34
56
-1
平均值为39.5
/*****************************第二部分***********
12-4-1
平均值为4
*********************************************************/
/**********************分析****************
1由上面的输出结果首先的问题是没有好的人机交互方式,显得比较生硬;
2由上面的第二部分看出,明显输出的是错误结果,当用户误输入时,不会有提醒,直接算出错误结果;
***********************************************************************************************/
/*下面是改的代码,,大家给我找错误,告诉我啊感激不尽!
只有不断发现错误,才会进步的*/
floatscore,average,sum=0;
//do{}while()来控制循环直到输入-1结束循环
请输入学生的成绩按-1结束\n"
if(score<
-1||(score>
-1&
score<
0))//判断用户输入值是不是合法
你输入错误\n"
elseif(score==-1)
结束输入\n"
sum+=score;
//计算总分
n++;
//计数器,记载输入学生的个数
}while(score!
=-1);
//对总分。
。
平均分的输出
if(n!
=0)//如果n为0说明没有输入学生数据(或正确的学生数据),就不执行下面的语句
你输入数据的个数为%d\n"
n);
你输入的成绩的总分为%g\n"