05典型程序C语言Word格式.docx
- 文档编号:22266502
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:15
- 大小:26.67KB
05典型程序C语言Word格式.docx
《05典型程序C语言Word格式.docx》由会员分享,可在线阅读,更多相关《05典型程序C语言Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
10286
stdio.h>
{intsum;
sum=0;
=550;
{if(fmod(i,3)==2&
fmod(i,5)==3)
sum+=1;
//编者提示:
根据题意改为正确语句
printf("
%ld\n"
);
1、打开考试系统提供的源程序或考生自己建立一个新C源文件,并将代码复制到新建立的文件中,注意扩展名为.c。
2、本题有二处错误,根据考题要求,将sum+=1改成:
sum+=i;
printf(“%ld\n”)改成:
printf(“%d”,sum);
例题3,编写程序:
高次方程尾数的问题:
求13的298次方的最后三位数。
(编者注:
“高次方程”应改为“高次方”)。
(929)
1、湖南省非计算机专业学生的计算机应用水平考试程序部分只需要程序的执行结果,因此,考生在程序部分的答题过程中,除通过编写程序得到结果,也可以使用其他方法求解,如EXCEL,计算器,数学公式等。
2、程序编写首先要确定好解决问题的方法,即算法。
本题的基本思路是:
在计算13的乘方过程中,每乘方一次,通过求余的方式保留最后三位:
t=t*13;
t=t%1000;
对于编程比较困难的考生,本题就可以利用上述算法通过手工、计算器、EXCEL等方式求解。
3、程序代码如下,编译并执行后,将执行程序获取的正确结果填入考试系统答案框中。
#include<
voidmain()
{longs=1;
inti;
for(i=1;
=298;
i++)
{s=s*13;
s=s%1000;
}
printf("
s);
2典型例题讲解
1.有通项公式的数列有关问题
例1输出1~100中所有整数的平方和。
(338350)
本例可以看作是求数列12,22,32,…前100项的和。
通项公式的f(i)就是i2,前100项之和就是s=12+22+…+1002。
{longi=1,s=0;
=100;
i++)s+=i*i;
%d\n"
本题注意事项:
数据类型建议采用long。
因为编程环境(TC和VC)的差异,可能会出错,在TC中,如果采用int,所能表示的最大整数为32767,本题会产生溢出,得到错误结果。
例2求数学式1-1/2+1/3-1/4+1/5-1/6+…+1/99-1/100的值。
(按四舍五入方式精确到小数点后4位)(0.6882)
本题有二种解法:
1、一次求一项,引入一个变量表示正负符号,flag=-flag实现正负号的切换
{inti,flag=1;
doublesum=0;
{sum=sum+flag*1.0/i;
flag=-flag;
%10.4lf"
sum);
2、一次求二项,步长值为2,循环次数减少1/2
{inti;
i=i+2)
sum=sum+1.0/i-1.0/(i+1);
实数的除法请使用1.0/i,如果改成1/i,本题所求结果将是0。
2.单项递推数列有关问题(可用EXCEL或计算器求解)
单项递推数列指的是,一个数列每一项都可以用含有它前一项的式子表示出来。
比如,等差数列和等比数列,这些数列是有通项公式的,处理较简单;
再如计算阶乘(n!
=n(n-1)!
),没有通项公式,就需要特殊的方法处理。
例3编程求10!
(即求t=1*2*3*4*5*6*7*8*9*10)(3628800)
{longi,t=1;
=10;
t=t*i;
%.ld\n"
t);
累乘变量t的初始值通常是1。
由于计算结果比较大,数据类型采用long。
例4求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+10)。
{longi,t=0,s=0;
{t=t+i;
s=s+t;
需要使用一个中间变量t来保存每一项,再将求得的每一项t累加到和s中。
3.多项递推数列有关问题(可用EXCEL或计算器求解)
多项递推数列的特点是,已知最前面的几项,而后面的项都可用前几项的公式表示出来。
这类问题编程,通常使用数组较为方便,且程序中,使用循环来计算一般项。
例5已知Fibonacci数列:
1,1,2,3,5,8,…,它可由下面公式表述:
F
(1)=1,F
(2)=1,F(n)=F(n-1)+F(n-2),试求F(45)值。
(1134903170)
{doublef1=1,f2=1,f;
inti=3;
for(;
=45;
{f=f1+f2;
f1=f2;
f2=f;
%20.0lf\n"
f);
已知第1,2项,因此,循环第3项开始至45项;
Fibonacci数列较大,在TC中建议采用double型保存各项及累加和。
例6已知Fibonacci数列:
1,1,2,3,5,8,13,……(第一项和第二项都是1,从第3项开始,每一项都是其前两项之和)。
求前50项中所有偶数项之和(第2、4、……、50项之和)。
(20365011072)
{doublef1=1,f2=1,s=1,f;
=50;
if(i%2==0)s=s+f;
已知前二项,从第3项开始计算到第50项,凡是偶数项,均累加至变量s;
其中第2项应提前保存到s变量。
4.数字有关问题
数字有关问题,指的是一些数,其组成的数字满足一定的性质。
如水仙花数、回文数等等。
C语言中,从一个正整数x中取出数字的方法:
x%10(个位)、,x/10%10(十位)、x/100%10(百位)、x/1000%10(千位)。
例7求水仙花数的个数(所谓水仙花数是指一个三位数,该数等于它各位数字立方之和。
例如153是水仙花数,因为1^3+5^3+3^3=153)。
小仙花数只有四个:
153、370、371、407)
值得特别注意的是,水仙花数求解的编程方法,适应一般的数字问题,区别在于,数的范围、位数(一般在5位以内)、数字满足的条件等方面。
{intn=0,i,a,b,c;
for(i=100;
=999;
{a=i/100;
b=i%100/10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)n++;
n);
%运算符只能对整数进行求余
例8统计[521,8421]之间有多少个回文整数(即倒过来跟原数一样,如525、1221等)。
以上两例给出的数的区间内既有3位数又有四位数,需要分二个阶段进行编程。
{intn=0,i,a,b,c,d;
for(i=521;
if(a==c)n++;
for(i=1000;
=8421;
{a=i/1000;
b=i/100%10;
c=i/10%10;
d=i%10;
if(a==d&
b==c)n++;
%d"
由于3位回文数考虑的是个位等于百位,4位回文数考虑的是个位等于千位,十位等于百位,因此,本题应该将3位回文数与4位回文数分成二个循环判断。
5.因子有关问题
因子,也称约数或因数。
两个整数a和b,如果a除以b的所得的余数为0,则称a的b的倍数,或称b是a的因数,也称a被b整除,或称b整除a。
因子有关问题,指的是某些整数的因子数目或因子的和满足一定性质的问题。
其编程关键是求一个数的因子数目或因子和的算法。
例9求出9269和8671的最大公约数和最小公倍数。
辗转相除法原理:
若a=bq+r,其中,r是a除以b所得的余数,则最大公约数(a,b)=(b,r)。
例如:
a=12345,b=135。
通过三次辗转相除,可得(12345,135)=(135,60)=(60,15)=(15,0)=15。
第一次:
12345=135*91+60
第二次:
135=60*2+15
第三次:
60=15*4+0(注:
余数为0时,终止)
辗转相除法的每一步的本质是一样,关键就是求一个数除以另一个数的余数。
其过程就是:
反复求余数,直到余数为0。
提示:
设a和b的最大公约数和最小公倍数分别是d和k,则a*b=d*k。
因此,通常先求最大公约数,再用公式求出最小公倍数。
voidmain()
{longa=9269,b=8671,r,d,k=0;
while(b>
0)
{r=a%b;
a=b;
b=r;
d=a;
k=9269*8671/d;
max=%ld,min=%ld\n"
d,k);
采用展转相除法,当余数为0时,分子即是最大公约数,本题中当循环结束时,即r=0时,由于b=r,因此b=0,a即是最大公约数。
最小公倍数为:
9269*8671/d。
例10求[10,1000]之间的所有完数之和。
各真因子之和(不包括自身)等于其本身的正整数称为完数。
6=1+2+3,6是完数。
#include"
stdio.h"
main()
{longi,j,s,sum=0;
for(i=10;
=1000;
{s=0;
for(j=1;
j<
i;
j++)
if(i%j==0)s=s+j;
if(s==i)sum=sum+i;
\n\n%ld\n"
求每个i的因子时,注意将保存各因子之和的变量s初始化为0,即s=0放循环体for(i=10;
i++)之后。
由于是求真因子之和,因此循环变量j<
i。
6.组合有关问题
大部分组合有关问题,都可转化为求方程或方程组的解的问题。
编程使用的是最常用的算法:
穷举法。
例11百钱百鸡古题。
用100个钱恰好买100只鸡,公鸡一只五个钱,母鸡一只三个钱,雏鸡三只一个钱,求共有几种买法(每种买法中,每种鸡的数目可以是0)。
用x、y、z分别表示公鸡、母鸡、雏鸡的只数,问题转化为求下面方程组的非负整数解:
若只从第一个方程看,x、y、z的取值范围都可粗略定为0~100;
若只从第二个方程看,x、y的取值范围分别可粗略定为0~20、0~33。
{longa,b,c,n=0;
for(a=0;
a<
=20;
a++)
for(b=0;
b<
=33;
b++)
for(c=3;
c<
c=c+3)
if(a+b+c==100&
(a*5+b*3+c/3)==100)n++;
公鸡5钱一只,最多能买20只(a变量),母鸡3钱一只,最多能买33只(b变量),雏鸡三只一个钱,只能是3的倍数(c变量)。
且要满足百钱百鸡二个等式。
例12求[121,140]之间的弦数的个数(若某正整数的平方等于另两个正整数平方之和,则称该数为弦数。
3^2+4^2=5^2,因此5是弦数)。
(8)
问题的数学描述是:
求解[121,140]中有多少个整数c,便得存在整数a,b,满足:
a2+b2=c2。
例如,可验证:
352+1202=1252、442+1172=1252,说明125是一个弦数(注:
不能计成两个)。
math.h"
for(c=121;
=140;
c++)
for(b=1;
c;
{a=(long)sqrt(c*c-b*b);
if(a==sqrt(c*c-b*b)&
b){n++;
break;
\n%ld\n"
程序中用到求平方根函数sqrt,必须包含头文件math.h;
为防止3^2+4^2=5^2和4^2+3^2=5^2的相同弦计算,条件语句if中增加a<
b。
7.素数有关问题
素数也叫质数,是大于1的正整数,除了1和它本身外,没有其它因子(偶数中只有2是素数)。
例13求640以内的所有的素数的个数。
intprime(intn)
{intk;
if(n<
=1)return0;
for(k=2;
k<
=n-1;
k++)
if(n%k==0)return0;
return1;
{inti,n=0,s=0;
for(i=640;
i>
=2;
i--)
if(prime(i))n++;
\n\n%d\n"
建议各位考生记住本题中判断一个数是否为素数的函数prime(intn),凡是有关素数求解问题,均可以使用。
例14求3-1000之间最大的五个素数之和。
=3;
if(prime(i))
{n++;
s=s+i;
if(n==5)break;
由于循环从大至小,计数器n==5时,即求得5个最大素数
8.平方数有关问题
一个整数叫做平方数,指的是它能表示为某个整数的平方。
如1、4、9、16、25、…。
一个整数是平方数的条件是,其平方根也是整数。
VB中,x是平方数的条件可写成:
sqr(x)=int(sqr(x))。
例15某些自然数对,两个自然数的和与差都是平方数。
如(17,8):
17+8=25、17-8=9都是平方数。
求满足条件0<
B<
A≤100的自然数对(A,B)中A-B之差的和。
/*数学函数sqrt的头文件math.h*/
{ints=0,a,b,c,d;
for(a=2;
b<
=a-1;
{c=a+b;
d=a-b;
if(sqrt(c)==(int)(sqrt(c))&
sqrt(d)==(int)(sqrt(d)))s=s+d;
9.其它杂题
例16已知数组S(x)中数组元素的值与Cos(x)一一对应,100=<
X=<
200,用比较法对数组进行从小到大的排序,并求出排完序之后S(150)的值。
结果按四舍五入保留四位小数)
{inti,j;
doubles[201],t;
=200;
i++)s[i]=cos(i);
200;
for(j=i+1;
201;
if(s[i]>
s[j])t=s[i],s[i]=s[j],s[j]=t;
%0.3f\n"
s[150]);
由于使用了数学函数cos(),必须包含头文件math.h;
如果数据交换表达式t=s[i],s[i]=s[j],s[j]=t;
之间不是使用逗号运算,则必须加{}。
例17求杨辉三角形中,第20行第10列的数为多少?
杨辉三角形,是指公式(a+b)n(n=0,1,2,…)的展开式的系数排列成的三角形(第一、二栏):
1
11
121
1331
14641
…………………………
1
11
121
1331
14641
10000
11000
12100
13310
{longa[100][100],row,col;
/*每一行第1列及对角线均为1*/
for(row=1,col=1;
row<
row++,col++)
a[row][1]=a[row][col]=1;
/*从第3开始,分别求第2列至对角线前1列,即row-1列*/
for(row=3;
row++)
for(col=2;
col<
=row-1;
col++)
{a[row][col]=a[row-1][col]+a[row-1][col-1];
a[20][10]value:
a[20][10]);
本题数值比较大,采用long;
首先将每一行第1列及对角线均赋值为1,再分别求各行的第2列至对角线之前所在列的数值:
a[row][col]=a[row-1][col]+a[row-1][col-1]。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 典型 程序 语言