资源描述:
《C语言编程练习题.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、本练习假设:整数int为4字节,运行环境为VC一、整数位数有关的问题1、输入一个整数,判断它是几位数?#includevoidmain(){inta,n=0;scanf("%d",&a);答案在后面思路:如何数出位数?while(a>0){a/=10;n++;}printf("%d",n);}扩展:编制一个函数,参数为整数,返回该整数的位数。答案在后面intdigits(inta){intn=0;while(a>0){a/=10;n++;}returnn;}2、编制一函数,得到一个整数的某一位的数字。intdigit(inta,intn)/*返回:整数a的倒数
2、第n位数,n从1开始*/{答案在后面思路:如何将倒数第n位用一个表达式取出?不能!转变成怎样后就能?while(n>1){a/=10;n--;}returna%10;}测试函数的例子:#includeintdigit(inta,intn);voidmain(){inta,n,d;scanf("%d%d",&a,&n);d=digit(a,n);printf("%d",d);}二、关于整数的几个题目1、输入两个正整数m和n,求其最大公约数和最小公倍数。算法分析:采用辗转相除法,先求出最大公约数d,然后求最小公倍数c=m*n/d。辗转相除法:余数=大数%小数,然后
3、将小数和余数再作辗转相除。#includevoidmain(){intm,n,a,b,d,c;scanf("%d,%d",&m,&n);if(m>n){a=m;b=n;}/*保证a>b*/else{a=n;b=m;}while((d=a%b)>0)/*每次循环都测试余数是否为0*/{a=b;b=d;}d=b;/*得到最大公约数*/c=m*n/d;/*得到最小公倍数*/printf("最大公约数是%d最小公倍数是%d",d,c);}拓展:编出求最大公约数的函数。intmcd(inta,intb){intd,t;if(a4、证a>b*/while((d=a%b)>0)/*每次循环都测试余数是否为0*/{a=b;b=d;}returnb;/*得到最大公约数*/}测试上述函数:#includeintmcd(inta,intb);voidmain(){intm,n,d,c;scanf("%d,%d",&m,&n);d=mcd(m,n);c=m*n/d;printf("最大公约数是%d最小公倍数是%d",d,c);}2、求出所有的水仙花数。水仙花数是一个三位数,其各位数字的立方和等于该数。例如153=1^3+5^3+3^3。#includevoidmain(){in
5、ts,a,b,c;for(s=100;s<=999;s++){a=s%10;b=s/10%10;c=s/100;/*分解出每一位*/if(a*a*a+b*b*b+c*c*c==s)printf("%d",s);}}按位循环:#includevoidmain(){ints,a,b,c;for(a=0;a<=9;a++)for(b=0;b<=9;b++)for(c=1;c<=9;c++){s=c*100+b*10+a;if(a*a*a+b*b*b+c*c*c==s)printf("%d",s);}}类似地:可以求出100以内的勾股数,如3^2+4^2=5^2。
6、三、关于数组的几个题目求2100的精确值。参考:#includevoidmain(){doubles=1.0;inti;for(i=1;i<=100;i++)s*=2;printf("%f",s);}运行结果:1267650600228229400000000000000.000000后面十多位全是0,因此是近似值。如何求精确值呢?(关键是如何保存每一位)#includevoidmain(){答案在后面ints[100]={1};/*初始化第一位为0,其它每一位为0*/inti,j,m=0;/*m指示最高位为s[m]*/for(i=1;i<=
7、100;i++){for(j=0;j<=m;j++)s[j]*=2;for(j=0;j<=m;j++)/*检查进位*/if(s[j]>9)/*第j位需要进位*/{s[j+1]+=s[j]/10;s[j]%=10;if(j+1>m)m=j+1;/*最高位进位*/}}printf("2^100=");for(j=m;j>=0;j--)printf("%d",s[j]);printf("");}运行结果:2^100=126765060022822940149670320