考研自用,不一定每题都写,有的太简单的或者阅读题需要直接出输出结果的就直接写书上了。大家对代码有什么问题也可以指出,一起学习。
本文参考C程序设计-方法与实践(清华大学出版社)习题解析如果要看更完整的解析可以看他的噢。
习题 2.1
计算函数y的值。
#include<stdio.h>
int main(){
int x,y;
scanf("%d",&x);
if(x<1)y=x;
if(x>=1&&x<10)y=2*x-1;
if(x>=10)y=3*x+11;
printf("%d",y);
return 0;
}
习题2.2
找出一元三次方程的求根公式。
篇幅过长这里位置太小写不下。
习题2.3
求三个数中 的最小数
#include<stdio.h>
int main(){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
if(x>y){
if(y>z)printf("%d",&z);//如果x>y>z输出z,否则输出y
else printf("%d",&y);
}else if(x>z)printf("%d",z);//如果z<x<y,输出z,否则输出x
else printf("%d",&x);
return 0;
}
习题2.4
变量赋值
#include<stdio.h>
int main(){
int x,y;
scanf("%d %d",&x,&y);
if(x>y)printf(%d %d,x,x-y);
else printf("%d %d",y,y-x);
return 0;
}
习题2.5
#include<stdio.h>
int main(){
int sum=0;
for(int i=1;i<100;i+=2)//每次+2;
sum+=i;
printf("%d",sum);
return 0;
}
习题2.6
统计1000以内的自然数的3的倍数之和
#include<stdio.h>
int main(){
int sum=0;
for(int i=1;3*i<1000;i++)
sum+=i*3;
printf("%d",sum);
}
习题2.7
输出0~360度中5的倍数的sin和cos值
在这里插入代码片
习题2.8
求正整数负整数零数量、和、平均值
#include<stdio.h>
int main(){
int n,zz=0,fz=0,zero=0,zzs=0,fzs=0;
for(int i=1;i<=20;i++){
scanf("%d",&n);
if(n>0)zz+=n,zzs++;
else if(n<0)fz+=n,fzs++;
else zero++;
}
printf("正整数:%d 负整数:%d 零:%d\n",zzs,fzs,zero);//正整数,负整数,0的数量
printf("正整数之和:%d 负整数之和:%d\n",zz,fz);//正整数负整数之和
printf("正整数平均值:%.2lf 负整数平均值:%.2lf\n",(double)zz/zzs,(double)fz/fzs));//正整数负整数平均值
return 0;
}
习题2.9
求最大正整数、最小正整数、最大负整数、最小负整数
#include<stdio.h>
int main(){
int n,maxint=0,minint=1e9,maxfint=-1e9,minfint=0;
for(int i=1;i<=20;i++){
scanf("%d",&n);
if(n>0){
maxint = n > maxint ? n : maxint;
minint = n < minint ? n : minint;
}else if(n<0){
maxfint = n > maxfint ? n : maxfint;
minfint = n < minfint ? n : minfint;
}
}
printf("%d %d %d %d",maxint,maxfint,minint,minfint);
return 0;
}
习题3.4
去掉最大最小值求平均值
#include <stdio.h>
int main() {
int m,sum=0,max=-1,min=1e9;
for(int i=1;i<=10;i++){
scanf("%d",&m);
sum+=m;
if(m>max)max=m;
if(m<min)min=m;
}
printf("%d\n",sum);
printf("%.3lf\n",(double)(sum-max-min)/8);
return 0;
}
习题3.5
求相邻两个数的差值
#include<stdio.h>
int main(){
int a[11]={0};
for(int i=1;i<=10;i++)scanf("%d",&a[i]);
for(int i=2;i<=10;i++)printf("%d ",a[i]-a[i-1]);
return 0;
}
习题3.6
输出字符串中askii码中最大的字符
#include<stdio.h>
#include <string.h>
int main(){
char s[1005];
scanf("%s",s);
int max=s[0];
int len=strlen(s);
for(int i=0;i<len;i++){
max=s[i]>max?s[i]:max;
}
printf("%c",max);
return 0;
}
习题3.7
计算字母出现次数
#include<stdio.h>
#include<string.h>
int main(){
char s[1005];
int num[200]={0};
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;i++){
num[(int)s[i]]++;
}
for(char c='A';c<='Z';c++){
printf("%c出现的次数为:%d\n",c,num[(int)c]);
}
for(char c='a';c<='z';c++){
printf("%c出现的次数为:%d\n",c,num[(int)c]);
}
return 0;
}
习题3.8
判断是否为空串
#include<stdio.h>
#include<string.h>
int main(){
char s[1005];
scanf("%s",s);
int len=strlen(s);
if(len!=0)printf("%s",s);
else printf("你输入的是空串");
return 0;
}
习题4.8
日期转换
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
printf("%d周%d天",n/7,n%7);
return 0;
}
习题4.9、4.10通用
反向输出数字
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
while(n){
printf("%d",n%10);
n/=10;
}
return 0;
}
习题4.11
计算1~10的平方和
#include<stdio.h>
int main(){
int sum=0;
for(int i=1;i<=10;i++){
sum+=i*i;
}
printf("%d",sum);
return 0;
}
习题5.6
ASKII码字符比较,可以直接进行比较。
#include<stdio.h>
int main(){
char n;
scanf("%c",&n);
if(n<32){
printf("控制字符\n");
}
else if(n>=48&&n<=57){
printf("数字字符\n");
}
else if(n>=65&&n<=90){
printf("大写字符\n");
}
else if(n>=97&&n<=122){
printf("小写字符\n");
}
else printf("其他字符\n");
return 0;
}
习题5.8
(1)
语法题一个一个判断就行
#include<stdio.h>
int main(){
int x;
scanf("%d",&x);
if(x<-5){
x=x*3+10;
}else if(x>=-5&&x<0){
;
}else if(x==0){
x=0;
}else if(x>0&&x<=5){
x*=2;
}else if(x>5){
x=x*4-10;
}
printf("%d",x);
return 0;
}
(2)
简单冒泡排序
#include<stdio.h>
int main(){
int num[4]={};
for(int i=1;i<=3;i++){
scanf("%d",&num[i]);
}
for(int i=1;i<3;i++){
for(int j=1;j<=2;j++){
if(num[j]>num[j+1]){
int t=num[j];
num[j]=num[j+1];
num[j+1]=t;
}
}
}
for(int i=1;i<=3;i++)printf("%d ",num[i]);
return 0;
}
(3)
分支结构
#include<stdio.h>
int main(){
int score,x5=0,x6=0,x7=0,x8=0,x9=0;
for(int i=1;i<=20;i++){
scanf("%d",&score);
if(score<60)x5++;
else if(score>=60&&score<70)x6++;
else if(score>=70&&score<80)x7++;
else if(score>=80&&score<90)x8++;
else if(score>=90)x9++;
}
printf("90及90分以上人数有:%d\n", x9);
printf("80-89分人数有:%d\n", x8);
printf("70-79分人数有:%d\n", x7);
printf("60-69分人数有:%d\n", x6);
printf("60分以下人数有:%d\n", x5);
return 0;
}
习题6.3.4
求s=a+aa+aaa+…
#include<stdio.h>
int main(){
int n,a,sum=0;
scanf("%d %d",&n,&a);
int single=a;//将个位记录起来
for(int i=1;i<=n;i++){
sum+=a;
a*=10;//每次乘10升位
a+=single;//之后再加上个位数
}
printf("%d",sum);
return 0;
}
习题6.3.5
#include<stdio.h>
int main(){
int n;
double count=0;
scanf("%d",&n);
while(n>0){
if(n<=10)count+=n*1.5,n=-1;//如果点歌时间不超过十分钟,金额为n*1.5;
else if(n>10&&n<=120)count+=15+(n-10),n=-1;//如果在10到120分钟之间,先加上10分钟的,在加上剩余的n分钟(元);
else if(n>120)count+=165,n-=360;//如果大于两个小时,就加上两个小时内的金额并减去6个小时的时间,这时如果大于六个小时则会进入下次循环。
}
printf("%.3lf",count);
return 0;
}
习题6.4.1
求给定值满足abc+cba=n的所有abc组合
#include<stdio.h>
int main(){
int n,flag=0;
scanf("%d",&n);
for(int i=100;i<=999;i++){
int t=i,s=0;
while(t){
s*=10;
s+=t%10;
t/=10;
}
if(i+s==n)printf("%d %d %d\n",i,s,n),flag=1;
}
if(!flag)printf("不存在ABC组合");
return 0;
}
习题6.4.2
百文钱买百只鸡,枚举,每次公鸡3+母鸡2+小鸡/3看是不是100文钱,之后在将小鸡数量相加看是不是一百只。
#include<stdio.h>
int main(){
for(int i=0;i<=100;i++){//公鸡
for(int j=0;j<=100;j++){//母鸡
for(int k=0;k<=100;k+=3){//这里每次一定要+3而不能+1,因为我们每次除的必须是3的倍数,否则答案会错误
if((i*3+j*2+k/3)==100&&i+j+k==100)printf("%d %d %d\n",i,j,k);
}
}
}
return 0;
}
习题6.4.4
思想:通过数组1~9的下标是否为1来判断是否出现了重复,如果有数组为0则说明出现了重复,通过除模取余等运算每次拿到数字中的一位,然后将他赋值给数组。
#include<stdio.h>
int main(){
int a[12]={0},flag=0;
for(int i=100;i<=999;i++){ //循环100~999,并且将i*2,i*3分别赋值
int k=i,s=i*2,t=i*3,flag=0;
while(k){a[k%10]=1;k/=10;}//将k的每一位赋值给数组
while(s){a[s%10]=1;s/=10;}//将s的每一位赋值给数组
while(t){a[t%10]=1;t/=10;}//将t的每一位赋值给数组
for(int j=1;j<10;j++){ //遍历数组,如果有为0的,说明这组数出现了重复,将flag置为1
if(!a[j]){
flag=1;
a[j]=0; //不管重复没重复都要将a[j]置为0方便下次遍历
}else a[j]=0;
}
if(!flag&&i*3<1000)printf("%d %d %d\n",i,i*2,i*3);//最后判断flag是否出现了重复,如果没出现并且i*3<1000则输出
}
return 0;
}
习题6.4.6
求同构数
#include<stdio.h>
int main(){
for(int i=2;i<=1000;i++){
if(i>1&&i<10){
if((i*i)%10==i)printf("%d\n",i);
}if(i>9&&i<100){
int t=i*i,g,s;
g=t%10;//取个位
t/=10;
s=t%10;//取十位
if((s*10+g)==i)printf("%d\n",i);
}if(i>99&&i<1000){
int t=i*i,g,s,b;
g=t%10;//取个位
t/=10;
s=t%10;//取十位
t/=10;
b=t%10;//取百位
if((b*100+s*10+g)==i)printf("%d\n",i);
}
}
return 0;
}
习题6.4.7
阿姆斯特朗数
#include<stdio.h>
bool check(int n,int kk){
int sum=0,t=n;
while(t){
int s=t%10;
int k=kk; //每次将kk的值赋值给k,这样即使while循环把k减完了我们依旧可以重新赋值
while(k){ //累乘k次
k--;
s*=t%10;
}
sum+=s;//每次加上当前数位的kk次方
t/=10;
}
if(sum==n)return true;
else return false;
}
int main(){
for(int i=10;i<=99;i++)if(check(i,1))printf("%d\n",i);
for(int i=100;i<=999;i++)if(check(i,2))printf("%d\n",i);
for(int i=1000;i<=9999;i++)if(check(i,3))printf("%d\n",i);
for(int i=10000;i<=99999;i++)if(check(i,4))printf("%d\n",i);
return 0;
}
习题7.5.2
打印字符
#include<stdio.h>
void prn_pict(int m,int n){
for(int i=0;i<m;i++){
char c='A'+i;
for(int j=1;j<=n;j++){
printf("%c",c);
}
printf("\n");
}
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
prn_pict(n,m);
return 0;
}
习题7.6
求最大公约数、最小公倍数
#include<stdio.h>
int gcd(int a,int b){//最大公约数
int tmp = 1;
while (tmp)
{
tmp = a % b;
a = b;
b = tmp;
}
return a;
}
int min(int c , int d) {//最小公倍数
int tmp;
tmp = c * d / gcd(c, d); //两数相乘再除于他们的最大公约数得出最小公倍数
return tmp ;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
printf("%d\n",gcd(n,m));
printf("%d\n",min(n,m));
return 0;
}
习题7.7
求离数值x最近的fibo数列的值
#include<stdio.h>
int n,a[1005]={0};
int nearest_fibo(int x){
for(int i=2;i<=x;i++){
if(a[i]<=x&&a[i+1]>=n){ //如果a[i]的值小于等于x并且a[i+1]的值大于等于x
int result= x-a[i] < a[i+1]-x ? a[i] : a[i+1];//通过做差找到哪个值离它最近
printf("%d",result);
break;
}
}
return 0;
}
int main(){
a[1]=a[2]=1;
for(int i=3;i<=1005;i++){
a[i]=a[i-1]+a[i-2];
}
scanf("%d",&n);
nearest_fibo(n);
return 0;
}
习题7.10
计算年龄和距离下一次生日的天数
#include<stdio.h>
int main(){
int a[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
int d,m,y,nd,nm,ny,birthday=0;
scanf("%d %d %d %d %d %d",&y,&m,&d,&ny,&nm,&nd);
if((y%100!=0&&y%4==0)||y%400==0)a[2]=29;//判断二月份
else a[2]=28;
if(nm>m||(nm==m&&nd>=d)){ //计算周岁
//如果今年已经过过生日
birthday+=a[nm]-d+a[m];//先把当前这个月和过生日那个月的天数加上
for(int i=nm+1;i<12;i++)birthday+=a[i];//加上今年剩余的
for(int i=1;i<m;i++)birthday+=a[i];//加上明年的
printf("%d %d\n",ny-y,birthday);
}else {
//如果今年还没过过生日
birthday+=a[nm]-d+a[m];//先把当前这个月和过生日那个月的天数
for(int i=nm+1;i<m;i++)birthday+=a[i];//加上中间完整的几个月
printf("%d %d\n",ny-y-1,birthday);
}
return 0;
}
习题11.3
#include<stdio.h>
struct student{ //用结构体存储
int id;
char name[50];
int yw,sx,yy;
float ave;
}stu[41];
int main(){
for(int i=1;i<=40;i++){ //输入数据并计算平均值
scanf("%d %s %d %d %d",
&stu[i].id,&stu[i].name,&stu[i].yw,&stu[i].sx,&stu[i].yy);
stu[i].ave=(stu[i].yw+stu[i].sx+stu[i].yy)/3;
}
for(int i=1;i<40;i++){
for(int j=1;j<=40-i;j++){ //按照平均值从小到大排序
if(stu[j].ave<stu[j+1].ave){
student tmp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=tmp;
}
}
}
for(int i=1;i<=5;i++){
printf("%s %.3f\n",stu[i].name,stu[i].ave);
}
return 0;
}
/*
1 xiaonie 20 30 100
2 xiaoniu 50 100 10
3 xiaozhu 15 25 95
*/
习题11.4
#include<stdio.h>
struct directory{
char id[5];
char name[50];
char num[50];
}drt[50];
int main(){
for(int i=1;i<=3;i++){
gets(drt[i].id);
gets(drt[i].name);
gets(drt[i].num);
}
printf("工作证号 姓名 电话号码\n");
for(int i=1;i<=3;i++){
printf("%-10s %-10s %-15s\n",drt[i].id,drt[i].name,drt[i].num);
}
return 0;
}
/*
201
Li Min
86214756
204
Gong Li zheng
86238556
218
Kong Ping
86222800
*/