C语言 文档 3.docx
《C语言 文档 3.docx》由会员分享,可在线阅读,更多相关《C语言 文档 3.docx(23页珍藏版)》请在冰豆网上搜索。
C语言文档3
二、循环结构程序设计部分
1. 求s=1+2+3+……+100,并输出结果,要求分别用while,do……while,for三种语句形式实现。
#include
voidmain()
{
inti=1,s=0;
while(i<=100)
{s=s+i;
i++;
}
printf("s=1+2+3+...+100的和是%d\n",s);
#include
voidmain()
{
for(inti=1,s=0;i<=100;i++)
s=s+i;
printf("s=1+2+3+...+100的和是%d\n",s);
}
#include
voidmain()
{
inti=1,s=0;
do
{s=s+i;i++;}
while(i<=100);
printf("s=1+2+3+...+100的和是%d\n",s);
}
2. 从键盘接收一个自然数n,计算n!
并输出结果,要求分别用while,do……while,for三种语句形式实现。
#include
voidmain()
{intn;
longs=1;
printf("请输入一个自然数:
");
scanf("%d",&n);
for(inti=1;i<=n;i++)s=s*i;
printf("%d!
=%ld\n",n,s);
}
3. 统计在所输入的50个实数中有多少个正数、多少个负数、多少个零。
#include
voidmain()
{intx=0,y=0,k=0;
floatnum;
for(inti=1;i<51;i++)
{scanf("%f",&num);
if(num>0)x=x+1;
else
if(num<0)y=y+1;
elsek=k+1;
}
printf("正数有%d个,负数有%d个,0有%d个\n",x,y,k);
}
4. 输出码值为32~127的ASCII码码值、字符对照表。
如下图所示
#include
voidmain()
{intx=0;
for(inti=32;i<=127;i++)
{if(i<100)printf("%d%-8c",i,i);
elseprintf("%d%-7c",i,i);
x=x+1;
if(x%8==0)printf("\n");
}
}
5. 求输入的十个整数中正数的个数及其平均值。
#include
voidmain()
{intnum,s=0;
floataverage=0;
printf("请输入10个整数:
");
for(inti=1;i<=10;i++)
{scanf("%d",&num);
s=s+num;
}
printf("平均数是:
%f\n",average/(i-1));
}
6. 求1~100之间的所有素数
#include
#include
voidmain()
{
intm=1,i,j=0;
doublek;
printf("1~100之间的素数有:
\n");
while(m<=100)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>k)
{
printf("%10d",m);
j++;
if(j%5==0)printf("\n");
}
m++;
}
}
7. 将用户输入的小写字母转换成大写字母,直到输入非小写字母字符。
#include
#include
voidmain()
{
charc;
while
(1)
{c=getchar();
if(c>='a'&&c<='y')
{c=c-32;
putchar(c);
putchar('\n');
}
elsebreak;
}
}
8. 验证哥德巴赫猜想:
任一充分大的偶数,可以用两个素数之和表示。
例如:
4=2+2,6=3+3,98=19+79
#include
#include
voidmain()
{
inti,n,j,k,m,l=0;
for(i=4;i<=1000;i+=2)/*i判断从4到1000之间的整数*/
{
for(n=2;n
{
for(j=2,k=1;j<=(int)sqrt(n);j++)/*判断n是否素数*/
{if(n%j==0)k=0;}
if(k)/*n是素数继续判断i-n是否素数*/
for(j=2,m=1;j<=(int)sqrt(i-n);j++)/*判断i-n是否素数*/
{if((i-n)%j==0)m=0;}
if(m)
{
printf("%d=%d+%d",i,n,i-n);
l++;
if(l%5==0)
printf("\n");
break;
}
}
if(n==i)printf("error%d\n",i);/*n等于i,i不遵循哥德巴赫猜想*/
}
}
9.
利用下面的公式求π的近似值,要求累加到最后一项小于10-6为止。
#include
#include
voidmain()
{ints;
floatn,t,pi;
t=1;pi=0;n=1.0;s=1;
while(fabs(t)>10e-6)
{pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf("pi=%10.6f\n",pi);
}
10.输入一个10进制正整数,然后输出它所对应的八进制、十六进制数。
#include
#defineN8
voidmain()
{
intn,num1,num2;
printf("请输入要转换的十进制数:
");
scanf("%d",&n);
num1=num2=n;
/*以下程序是将10进制数转换为8进制数*/
intarr[N],i;
for(i=0;i{
arr[i]=num1%8;
num1=num1/8;
if(num1==0)
break;
}
printf("转换为8进制数为:
");
for(;i>=0;i--)
printf("%d",arr[i]);
printf("\n");
/*以下程序是将10进制数转换为16进制数*/
intarr2[N],j;
for(j=0;j{
arr2[j]=num2%16;
num2=num2/16;
if(num2==0)
break;
}
printf("转换为16进制数为:
");
for(;j>=0;j--)
switch(arr2[j])
{
case10:
printf("A");break;
case11:
printf("B");break;
case12:
printf("C");break;
case13:
printf("D");break;
case14:
printf("E");break;
case15:
printf("F");break;
default:
printf("%d",arr2[j]);
}
printf("\n");
}
1. 一个数如恰好等于它的因子之和,这个数就称为“完数”。
编程序找出1000以内的所有完数,并输出其因子(6是一个"完数",它的因子是1,2,3)
#include
#include
voidmain()
{
for(inti=1;i<=1000;i++)
{
for(intj=1,sum=0;j
if(i%j==0)sum=sum+j;
if(sum==i)
{
printf("%ditsfactorsare1",i);
for(j=2;j
{if(i%j==0)
printf(",%d",j);}
printf("\n");
}
}
}
2. 输入一个正整数,输出它的所有质数因子(如180的质数因子为2、2、3、3、5)。
#include
intmain()
{
intnum,y,i,j;
scanf("%d",&num);
printf("%d=",num);
for(i=2;i<=num;i++)
{
while(num%i==0)
{
printf("%d*",i);
num=num/i;
}
}
printf("\n");
}
3. 求出1至100000之间的素数(只能被1和自身整除的数)以每行10个数输出在屏幕上。
#include
#include
voidmain()
{inti,k,n,a=0;
for(i=1;i<=100000;i=i+2)
{k=sqrt(i);
for(n=2;n<=k;n++)
if(i%n==0)break;
if(n>=k+1)
{printf("%d",i);
a++;}
if(a%10==0)printf("\n");}
printf("\n");
}
4. 试编程找出1至99的所有,,所谓同构数是指它出现在它的平方数的右边。
如6的平方数36故6是同构数。
#include
voidmain()
{
ints;
for(inti=1;i<100;i++)
{s=i*i;
if(i==s%(i<10?
10:
100))printf("%6d",i);
elseif(i==s%(i<10?
10:
100))printf("%6d",i);
}
}
5. 求这样一个三位数,该三位数等于其每位数字的阶乘之和。
#include
voidmain()
{intn,a,b,x,y,s;
for(n=101;n<1000;n++)
{s=0;
for(a=1;a<101;a*=10)
{y=1;
b=(n/a)%10;
if(b==0)y=0;
for(x=1;x<=b;x++)y*=x;
s+=y;
}
if(n==s)printf("%d",n);
}
}
6. 编写程序。
用面值一元的一张人民币兑换1分、2分和5分的硬币共有多少种换法?
打印出每种换法。
见第26题
7. 编程求下列算式:
(要求最后一项小于10-3)SUM=1+1/2+1/3+1/4+……
#include
#include
voidmain()
{floats,n;
s=1;n=0;
while(fabs(1/s)>10e-3)
{n=n+1/s;
s=s+1;
}
printf("%f\n",n);
}
8. 利用牛顿迭代法求方程
的根。
main()
{doublex,y;x=1.5;
do
{y=2*x*x*x-4*x*x+3*x-6;
x=x-y/(6*x*x-8*x+3);}
while(y!
=0);
printf("x=%.3f\n",x);
}
牛顿迭代法(Newton'smethod)又称为牛顿-拉夫逊方法(Newton-Raphsonmethod),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。
方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。
牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x)=0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。
另外该方法广泛用于计算机编程中。
设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值。
过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴交点的横坐标x2=x1-f(x1)/f'(x1),称x2为r的二次近似值。
重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。
解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。
把f(x)在x0点附近展开成泰勒级数f(x)=f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2!
+…取其线性部分,作为非线性方程f(x)=0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0)这样,得到牛顿法的一个迭代序列:
x(n+1)=x(n)-f(x(n))/f'(x(n))。
#include
#include
voidmain()
{floatx1,x0,f,f1;
x1=1.5;
do{x0=x1;
f=((2*x0-4)*x0+3)*x0-6;
f1=(6*x0-8)*x0+3;
x1=x0-f/f1;
}while(fabs(x1-x0)>=1e-5);
printf("%5.2f\n",x1);
}
9. 利用二分法求方程
的根。
#include
#include
voidmain()
{floatx0,x1,x2,fx0,fx1,fx2;
do{printf("enterx1&x2:
");
scanf("%f,%f",&x1,&x2);
fx1=x1*((2*x1-4)*x1+3)-6;
fx2=x2*((2*x2-4)*x2+3)-6;
}while(fx1*fx2>0);
do
{x0=(x1+x2)/2;
fx0=x0*((2*x0-4)*x0+3)-6;
if(fx0*fx1<0)
{x2=x0;
fx2=fx0;
}
else
{x1=x0;
fx1=fx0;
}
}while(fabs(fx0)>=1e-5);
printf("x=%6.2f\n",x0);
}
10.采用Euclid(欧几里德)算法来求最大公因子,其算法是:
(1)输入两个正整数m和n。
(2)用m除以n,余数为r,如果r等于0,则n是最大公因子,算法结束,否则(3)。
(3)把n赋给m,把r赋给n,转
(2)。
#include
voidmain()
{intn,m,temp,p,r;
printf("请输入两个数:
");
scanf("%d,%d",&m,&n);
if(n>m){temp=n;n=m;m=temp;}
p=m*n;
while(n!
=0)
{r=m%n;
m=n;
n=r;
}
printf("最大公约数是%d\n",m);
printf("最小公倍数是%d\n",p/m);
}
1. 用循环结构程序设计方法,输出一个九九乘法表
#include
voidmain()
{inti,j;
for(i=1;i<=9;i++)
{for(j=1;j<=i;j++)
printf("%d*%d=%2d",i,j,i*j);
printf("\n");
}
}
2. 求(即求1!
+2!
+3!
+…+11!
+12!
)。
#include
voidmain()
{inta,b,c,s=0;
for(a=1;a<13;a++)
{c=1;
for(b=1;b<=a;b++)c*=b;
s+=c;
}
printf("%d\n",s);
}
3.
4. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方之和等于该数本身。
#include
voidmain()
{inta,b,c;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
if(100*a+10*b+c==a*a*a+b*b*b+c*c*c)
printf("%d%d%d\n",a,b,c);
}
5. 魔方阵
8
1
6
3
5
7
4
9
2
编程实现魔方阵。
即n2(n为奇数)个自然数填入方阵中,使它的每行、每列及对对角线的数之和为
。
n=3时,则为:
(数组7.7太复杂下次补上)
6. 计算用户输入的两正整数之间的所有整数中0,1,2,…,9数码的个数。
例如,101~104之间总共包含四个整数101,102,103,104,其中0的个数为4,1的个数为5,2、3、4的个数都为1,其余数码没出现都为0。
inputtwointeger:
15003000↙
0–4031–9002–14003–401
4 –4005–5006–5007–500
8–5009–500
#include
main()
{inta,b,c,x,y,n0=0,n1=0,n2=0,n3=0,n4=0,n5=0,n6=0,n7=0,n8=0,n9=0;
printf("inputtwointeger:
");
scanf("%d%d",&a,&b);
for(c=a;c<=b;c++)
{for(x=1;c/x>0;x*=10)
{y=(c/x)%10;
switch(y)
{case9:
n9++;break;
case8:
n8++;break;
case7:
n7++;break;
case6:
n6++;break;
case5:
n5++;break;
case4:
n4++;break;
case3:
n3++;break;
case2:
n2++;break;
case1:
n1++;break;
case0:
n0++;break;
}
}
}
printf
("0-%d\t1-%d\t2-%d\t3-%d\n4-%d\t5-%d\t6-%d\t7-%d\n8-%d\t9-%d\n",n0,n1,n2,n3,
n4,n5,n6,n7,n8,n9);
}
7. 换零钱:
把一元人民币换成现行的角硬币,共有多少种兑换方法?
#include
voidmain()
{inta,b,c,n=0;
for(a=0;a<21;a++)
{for(b=0;b<51;b++)
{for(c=0;c<101;c++)
if(5*a+2*b+c==100)
{printf("%d*5+%d*2+%d=100\t",a,b,c);n++;if(n%3==0)printf("\n");
}
}
}
}
8. 递增的牛群:
若一头小母牛,从第4个年头开始每年生育一头母牛,按照此规律,第n年时有多少头母牛?
请设计求解该问题的c语言程序。
#include
#include
main()
{doublef=0,con=2;
intn=0,a=0,b=0;
printf("请输入年数:
");
scanf("%d",&n);
a=n%4;
b=(n-a)/4;
f=pow(con,(double)b);
printf("最终有%d头母牛\n",(int)f);
}
9. 准备客票:
某铁路线上共有10个车站,问需要准备几种车票?
设计求解该问题的c语言程序。
提示:
这个是累加的问题,有10个站即需要9+8+7+……+1种车票(这里从a站到b
站和从b站到a站用同样的票,如果去和来用不同的车票则总和乘以2就好)。
10. 板砖问题:
有36块砖,由36人搬:
一男搬4块,一女搬3块,两个小孩抬一块。
要求一次全部搬完。
问男、女、小孩人数个若干?
#include
voidmain()
{intm,w,c,t;
for(m=1;m<=9;m++)
{for(w=1;w<=33;w++)
{c=36-w-m;
if(c%2==0&&4*m+3*w+c/2==36)
printf("m=%dw=%dc=%d",m,w,c);
}
}
}
11. 爱因斯坦的阶梯问题:
设有一个阶梯,若每步跨3阶,最后余2阶;若每步跨5阶,最后余4阶;若每步跨6阶,最后余5阶;若每步跨7阶,正好到达。
问共有多少级阶梯。
#include
voidmain()
{inti;
for(i=7;;i++)
if(i%3==2&&i%5==4&&i%6==5&&i%7==0)
{printf("%d\n",i);break;}
}
12. 编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则计算机给出提示:
“Right!
”,否则提示:
“Wrong!
”,并告诉人所猜的数是大(Toohigh)还是小(Toolow),然后结束游戏。
要求每次运行程序时机器所“想”的数不能都是一样的。
(提示:
随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”通过键入随机数种子
产生[0,100]之间的随机数
scanf("%u",&seed);
srand(seed);
magic=rand()%100+1;
#include
#include
voidmain()