浙大版《C语言程序设计(第4版)》题目集

第二章

练习2-1 Programming in C is fun!

#include 
int main()
{
	puts("Programming in C is fun!");
	return 0;
}

练习2-3 输出倒三角图案

#include 
int main()
{
	puts("* * * *");
	puts(" * * *");
	puts("  * *");
	printf("   *");
	return 0;
}

练习2-4 温度转换

#include 
int main()
{
	double F=150;
	//fahr = 150, celsius = 计算所得摄氏温度的整数值
	//scanf("%lf",&F);
	double C=(5.0/9)*(F-32);
	printf("fahr = 150, celsius = %d\n",(int)C);
	return 0;
}

练习2-6 计算物体自由下落的距离

#include 
int main()
{
	double ans=10*3*3/2;
	printf("height = %.2lf\n",ans);
} 

练习2-8 计算摄氏温度

#include 
int main()
{
	int x;
	scanf("%d",&x);
	printf("Celsius = %d\n",(int)5.0*(x-32)/9);
	return 0;
} 

练习2-9 整数四则运算

#include 
#include 
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d + %d = %d\n",a,b,a+b);
	printf("%d - %d = %d\n",a,b,a-b);
	printf("%d * %d = %d\n",a,b,a*b);
	printf("%d / %d = %d\n",a,b,a/b);
	return 0;
} 

练习2-10 计算分段函数[1]

#include 
int main()
{
	double x;
	scanf("%lf",&x);
	double ans=x==0?0:1/x;
	printf("f(%.1lf) = %.1lf\n",x,ans);
	return 0;
} 

练习2-11 计算分段函数[2]

#include 
#include 
int main()
{
	double x;
	scanf("%lf",&x);
	printf("f(%.2lf) = %.2lf\n",x,x>=0?pow(x,0.5):(x+1)*(x+1)+2*x+1/x);
	return 0;
} 

练习2-13 求N分之一序列前N项和

#include 
int main()
{
	int x;
	scanf("%d",&x);
	double sum=0;
	for(int i=1;i<=x;i++) sum+=1.0/i;
	printf("sum = %.6lf\n",sum);
	return 0;
} 

练习2-14 求奇数分之一序列前N项和

#include 
int main()
{
	int x;
	scanf("%d",&x);
	double sum=0;
	for(int i=1;i<=x;i++) sum+=1.0/(2*i-1);
	printf("sum = %.6lf\n",sum);
	return 0;
} 

练习2-15 求简单交错序列前N项和

#include 
int main()
{
	int x;
	scanf("%d",&x);
	double sum=0,flag=1;
	for(int i=1;i<=x;i++)
	{
		sum+=flag/(3*(i-1)+1);
		flag*=-1;
	} 
	printf("sum = %.3lf\n",sum);
	return 0;
} 

练习2-17 生成3的乘方表

#include 
int main()
{
	int n,m;
	scanf("%d",&n);
	long long p=1;
	for(int i=0;i<=n;i++)
	{
		printf("pow(3,%d) = %lld\n",i,p);
		p*=3;
	}
	return 0;
}

练习2-18 求组合数

#include 
#include 
double fact(int x)
{
	double ans=1;
	for(int i=1;i<=x;i++) ans*=i;
	return ans;
}
int main()
{
	int n,m;
	scanf("%d%d",&m,&n);
	printf("result = %.0lf\n",fact(n)/(fact(m)*fact(n-m)));
	return 0;
}

习题2-1 求整数均值

#include 
int main()
{
	int sum=0;
	for(int i=1;i<=4;i++)
    {
    	int x;
    	scanf("%d",&x);
    	sum+=x;
	}
	printf("Sum = %d; Average = %.1f\n",sum,sum/4.0);
	return 0;
}

习题2-2 阶梯电价

#include 
#include 
int main()
{
	int x;
	scanf("%d",&x);
	if(x<0)
	{
		puts("Invalid Value!");
		return 0;
	}
	printf("cost = %.2lf\n",x<=50?1.0*x*0.53:0.53*50+1.0*(x-50)*0.58);
	return 0;
} 

习题2-3 求平方与倒数序列的部分和

#include 
int main()
{
	int n,m;
	double sum=0,flag=1;
	scanf("%d%d",&m,&n);
	for(int i=m;i<=n;i++) sum+=i*i+1.0/i;
	printf("sum = %.6lf\n",sum);
	return 0;
}

习题2-4 求交错序列前N项和

#include 
int main()
{
	int n;
	double sum=0,flag=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) sum+=flag*i/(2*i-1),flag*=-1;
	printf("%.3lf\n",sum);
	return 0;
}

习题2-5 求平方根序列前N项和

#include 
#include 
int main()
{
	int n,m;
	scanf("%d",&n);
	double sum=0;
	for(int i=1;i<=n;i++)
	{
		sum+=sqrt(i);
	}
	printf("sum = %.2lf\n",sum);
	return 0;
}

习题2-6 求阶乘序列前N项和

#include 
#include 
int main()
{
	int n,m;
	scanf("%d",&n);
	int ans=0,sum=1;
	for(int i=1;i<=n;i++) sum*=i,ans+=sum;
	printf("%d\n",ans);
	return 0;
}

第三章

练习3-2 计算符号函数的值

#include 
#include 
int main()
{
	int n,m;
	scanf("%d",&n);
	if(n>0) printf("sign(%d) = 1\n",n);
	if(n==0) printf("sign(%d) = 0\n",n);
	if(n<0) printf("sign(%d) = -1\n",n);
	return 0;
}

练习3-3 统计学生平均成绩与及格人数

#include 
int main()
{
	int sum=0,tot=0,n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
    {
    	int x;
    	scanf("%d",&x);
    	sum+=x;
    	tot+=(x>=60);
	}
	printf("average = %.1lf\ncount = %d",n==0?0.0:1.0*sum/n,tot);
	return 0;
}

练习3-4 统计字符

#include 
#include 
int main()
{
	
	int ans1=0,ans2=0,ans3=0,ans4=0;
	for(int i=1;i<=10;i++)
	{
		char c=getchar();	
		if(c==' '||c=='\n'||c=='\r') ans2++;
		else if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) ans1++;
		else if(c>='0'&&c<='9') ans3++;
		else ans4++;
	}
	printf("letter = %d, blank = %d, digit = %d, other = %d\n",ans1,ans2,ans3,ans4); 
	return 0;
}

练习3-5 输出闰年

#include 
int main()
{
	int n,flag=0;
	scanf("%d",&n);
	if(n<2001||n>2100)
	{
		puts("Invalid year!");
		return 0;
	}
	for(int i=2001;i<=n;i++)
	{
		int x=i;
		if((x%4==0&&x%100)||(x%400==0)) printf("%d\n",x),flag=1;
	}
	if(!flag) puts("None");
	return 0;
}

练习3-7 成绩转换

#include 
int main()
{
	int n,flag=0;
	scanf("%d",&n);
	if(n>=90)
	{
		puts("A");
		return 0;
	}
	if(n>=80)
	{
		puts("B");
		return 0;
	}
	if(n>=70)
	{
		puts("C");
		return 0;
	}
	if(n>=60)
	{
		puts("D");
		return 0;
	}
	puts("E");
	return 0;
}

练习3-8 查询水果价格

#include 
int main()
{
	puts("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit");
	for(int i=1;i<=5;i++)
	{
		int x;
		scanf("%d",&x);
		if(!x) break;
		if(x==1) printf("price = 3.00\n");
		else if(x==2) printf("price = 2.50\n");
		else if(x==3) printf("price = 4.10\n");
		else if(x==4) printf("price = 10.20\n");
		else printf("price = 0.00\n");
	}
	return 0;
}

习题3-1 比较大小

#include 
#include 
void swap(int *x,int *y)
{
	int tmp=(*x);
	*x=(*y),(*y)=tmp;
}
int main()
{
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	if(a>b) swap(&a,&b);
	if(a>c) swap(&a,&c);
	if(b>c) swap(&b,&c);
	printf("%d->%d->%d\n",a,b,c); 
	return 0;
}

习题3-2 高速公路超速处罚

#include 
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	if((a-b)*10<b) puts("OK");
	else if((a-b)*2<b) printf("Exceed %.0lf%%. Ticket 200\n",(a-b)*100.0/b); 
	else printf("Exceed %.0lf%%. License Revoked\n",(a-b)*100.0/b); 
	return 0;
}

习题3-3 出租车计价

#include
int main()
{
	double mile=0;
	int time=0;
	double price,price1,price2;
	scanf("%lf%d",&mile,&time);
	if (mile<=3) price1=10;
	else if(mile<=10) price1=10+(mile-3)*2.0;
	else price1=10+(10-3)*2.0+(mile-10)*3.0;
	price2=time/5*2;
	price=price1+price2;
	printf("%.0f\n",price);
	return 0;
}

习题3-4 统计学生成绩

#include 
int main()
{
	int n;
	scanf("%d",&n);
	int A=0,B=0,C=0,D=0,E=0;
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		A+=(x>=90);
		B+=((x>=80)&&(x<90));
		C+=((x>=70)&&(x<80));
		D+=((x>=60)&&(x<70));
		E+=(x<60);
	}
	printf("%d %d %d %d %d\n",A,B,C,D,E);
	return 0;
}

习题3-5 三角形判断

#include 
#include 
int main()
{
	double x1,y1,x2,y2,x3,y3;
	scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
	double len1=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	double len2=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
	double len3=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
	if(len1>len2)
	{
		double tmp=len2;
		len2=len1,len1=tmp;
	}
	if(len1>len3)
	{
		double tmp=len3;
		len3=len1,len1=tmp;
	}
	if(len2>len3)
	{
		double tmp=len3;
		len3=len2,len2=tmp;
	}
	double s=(len1+len2+len3)/2;
	if(len1+len2<=len3) puts("Impossible");
	else printf("L = %.2lf, A = %.2lf\n",len1+len2+len3,sqrt(s*(s-len1)*(s-len2)*(s-len3)));
	return 0;
}

第四章

练习4-3 求给定精度的简单交错序列部分和

#include 
#include 
int main()
{
    double exp;
    scanf("%lf",&exp);
    int i,l=1;
    double sum=0,t;
    for(i=1;;i+=3)
    {
        t=1.0/i*l;
        sum+=t;
        if(fabs(t)<=exp) break;
        l=-l;
    }
    printf("sum = %.6lf\n",sum);
    return 0;
}

练习4-6 猜数字游戏

#include
int main ()
{
    int num,n; 
	scanf("%d%d",&num,&n);
	int pn,count=0;
	for(int i=1;i<=n;i++)
	{
	  scanf("%d",&pn);
	  count++;
	  if(count==1&&pn==num)
	  {
	   	printf("Bingo!");
	   	break;
	  }
	  else if(count<=3&&count>1&&pn==num)
	  {
	   	printf("Lucky You!");
	   	break;
	  }
	  else
	  {
	   if(pn<0)
	   {
	    printf("Game Over");
	    break;
	   }
	   if(pn>num) printf("Too big\n");
	   if(pn<num) printf("Too small\n");
	   if(pn == num) printf("Good Guess!");
	  }
	 }
	 if(pn!=num&&count==n) printf("Game Over");
	 return 0;
}

练习4-7 求e的近似值

#include 
int main()
{
	int n;
	double ans=1,tmp=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 tmp*=i,ans+=1/tmp;
	printf("%.8lf\n",ans);
	return 0;
}

练习4-10 找出最小值

#include 
int main()
{
	int n,minx=0x7fffffff;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		if(minx>x) minx=x;
	}
	printf("min = %d\n",minx);
	return 0;
}

练习4-11 统计素数并求和

#include 
int main()
{
	int n,m,sum=0,cnt=0;
	scanf("%d%d",&m,&n);
	for(int i=m;i<=n;i++)
	{
		int flag=0;
		if(i==1) continue;
		for(int j=2;j*j<=i&&flag==0;j++)
		 if(i%j==0) flag=1;
		if(!flag) sum+=i,cnt++;
	}
	printf("%d %d\n",cnt,sum);
	return 0;
}

习题4-1 求奇数和

#include 
int main()
{
	int n,sum=0;
	while(1)
	{
		int x;
		scanf("%d",&x);
		if(x<=0) break;
		if(x%2) sum+=x;
	}
	printf("%d\n",sum);
	return 0;
}

习题4-2 求幂级数展开的部分和

#include 
int main()
{
	double x,fc=1,base,i=2;
	double sum=1;
	scanf("%lf",&x);
	base=x;
	for(int i=1;;i++)
	{
		double l=base/fc;
		sum+=l;
		if(l<0.00001) break;
		base*=x,fc*=(i+1);
	}
	printf("%.4lf\n",sum);
	return 0;
}

习题4-3 求分数序列前N项和

#include 
int main(void)
{
	int n;
	scanf("%d",&n);
	double fc=2,fm=1,t=0;
	double sum=0;
	for(int i=1;i<=n;i++)
	{
		sum+=fc/fm;
		t=fc;
		fc=fc+fm;
		fm=t;
	}
	printf("%0.2lf",sum);
	
	return 0;
}

习题4-4 特殊a串数列求和

#include 
int main(void)
{
	int n,a,sum=0,p=0;
	scanf("%d%d",&a,&n);
	for(int i=1;i<=n;i++)
	{
		p=p*10+a;
		sum+=p;
	}
	printf("s = %d\n",sum);
	return 0;
}

习题4-5 换硬币

在#include <stdio.h>
int main(void)
{
	int n,tot=0;
	scanf("%d",&n);
	for(int i=n/5;i>=1;i--)
	 for(int j=n/2;j>=1;j--)
	  for(int k=n;k>=1;k--)
	   if(i*5+j*2+k==n) printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k),tot++;
	printf("count = %d\n",tot);
	return 0;
}

习题4-6 水仙花数

#include   
#include 
int main()
{  
	int N,num;
	int min,max;
	int sum;
	scanf("%d",&N);
	min=pow(10,N-1);
	max=pow(10,N)-1;
	if(N==7)
	{    
        printf("1741725\n");    
        printf("4210818\n");    
        printf("9800817\n");    
        printf("9926315\n");  
    }
	else
	{
    	for(min;min<=max;min++)
		{
			num=min;
			sum=0;
			for(int i=1;i<=N;i++)
			{ 	
				int item;
				item=pow(num%10,N);	
				sum=sum+item;
				num=num/10;	
			}
			if(min==sum) printf("%d\n",min);
		}	 
    } 
	
	
    return 0;  
}

习题4-7 最大公约数和最小公倍数

#include   
#include 
int gcd(int a,int b)
{
	if(!b) return a;
	return gcd(b,a%b);
}
int main()
{  
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d %d\n",gcd(a,b),a*b/gcd(a,b));
    return 0;  
}

习题4-8 高空坠球

#include   
#include 
int main()
{  
	double s=0,h;
	int n;
	scanf("%lf%d",&h,&n);
	for(int i=1;i<=n;i++)
	{
		s+=h;
		if(i!=1) s+=h;
		//printf("%.1lf\n",h);
		h/=2;
	}
	printf("%.1lf %.1lf\n",s,n==0?0:h);
    return 0;  
}

习题4-9 打印菱形图案

#include 
int main()
{
	int n=0;
	scanf("%d",&n);
	int row=(n/2)+1;
	for(int i=1;i<=row;i++)
	{
	 for(int j=row-i;j>0;j--)
		printf("  ");
		
	 for(int j=0;j<(2*i-1);j++)
		printf("* ");
		
	 printf("\n");
	}
	for(int i=1;i<row;i++)
	{
		for(int j=0;j<i;j++)
		 printf("  ");
			
	    for(int j=(row-i)*2-1;j>0;j--)
		 printf("* ");
		
		printf("\n");
	}
 
	return 0;
}

习题4-10 猴子吃桃问题

#include 
int main()
{
	int n,sum=1;
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	 sum=(sum+1)*2;
	printf("%d\n",sum);
	return 0;
}

习题4-11 兔子繁衍问题

#include 
int main()
{
	int n;
	scanf("%d",&n);
	if(n<=1)
	{
		puts("1");
		return 0;
	}
	int a=1,b=1;
	for(int i=3;;i++)
	{
		int c=a+b;
		a=b,b=c;
		if(c>=n)
		{
			printf("%d\n",i);
			return 0;
		}
	}
	return 0;
}

第五章

练习5-1 求m到n之和

int sum(int m,int n)
{
	int res=0;
	for(int i=m;i<=n;i++) res+=i;
	return res;
}

练习5-2 找两个数中最大者

int max(int a,int b)
{
	return a>b?a:b;
}

练习5-3 字符金字塔

void CharPyramid( int n, char ch)
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=(n-i);j++)printf(" ");
		for(int j=1;j<=i;j++) printf("%c ", ch);
		printf("\n");
	}
}

习题5-1 符号函数

int sign(int x)
{
	if(x<0) return -1;
	if(x==0) return 0;
	if(x>0) return 1;
}

习题5-2 使用函数求奇数和

int even(int n)
{
	return (n+1)%2;
}
int OddSum(int List[],int N)
{
	int sum=0;
	for(int i=0;i<N;i++)
	 if(!even(List[i])) sum+=List[i];
	return sum;
}

习题5-3 使用函数计算两点间的距离

double dist( double x1, double y1, double x2, double y2 )
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

习题5-4 使用函数求素数和

int prime( int p )
{
	if(p<=0) return 0; 
	if(p==1) return 0;
	if(p==2) return 1;
	for(int i=2;i*i<=p;i++)
	 if(p%i==0) return 0;
	return 1;
}
int PrimeSum( int m, int n )
{
	int sum=0;
	for(int i=m;i<=n;i++)
	 sum+=prime(i)*i;
	return sum;
}

习题5-5 使用函数统计指定数字的个数

int CountDigit( int number, int digit )
{
	int cnt=0;
	if(number<0) number=-number;
	do{
		if(digit==number%10) cnt++;
		number/=10;
	}while(number);
	return cnt;
}

习题5-6 使用函数输出水仙花数

int narcissistic( int number )
{
	int cnt=0,sum=0,p=number,l=number;
	while(number) number/=10,cnt++;
	while(p)
	{
		int x=p%10,tmp=1;
		for(int i=1;i<=cnt;i++)
		 tmp*=x;
		sum+=tmp;
		p/=10;
	}
	return sum==l;
}
void PrintN( int m, int n )
{
	for(int i=m+1;i<n;i++)
	 if(narcissistic(i)) printf("%d\n", i);
}

习题5-7 使用函数求余弦函数的近似值

double funcos( double e, double x )
{
	double sum=0;
	double tx=1,p=1,flag=1;
	for(int i=0;;i++)
	{
		if(i%2==0)
		{
			sum+=flag*tx/p;
			if(tx/p<e) return sum;
			flag=-flag;
		}
		tx*=x,p*=(i+1);
	}
}

习题5-8 空心的数字金字塔

void hollowPyramid (int n)
{
	int x=1;
	for(int i=1;i<n;i++)
	{
		for(int j=(n-i);j>=1;j--) printf(" ");
		printf("%d", i);
		if(i==1)
		{
			printf("\n");
			continue;
		}
		for(int j=1;j<=x;j++) printf(" ");
		x+=2;
		printf("%d\n", i);
	}
	for(int i=1;i<=(2*n-1);i++) printf("%d", n);
}

第六章

练习6-3 英文字母替换加密(大小写转换+后移1位)

#include 
char s[1001];
int main()
{
	while(1)
	{
		char ch=getchar();
		if(ch=='\n') break;
		if(ch>='a'&&ch<='z')
		{
			if(ch!='z') ch++;
			else ch='a';
			printf("%c",ch-'a'+'A');
		}
		else if(ch>='A'&&ch<='Z')
		{
			if(ch!='Z') ch++;
			else ch='A';
			printf("%c",ch-'A'+'a');
		}
		else printf("%c",ch);
	}
	return 0;
}

习题6-1 分类统计字符个数

void StringCount( char s[] )
{
	int ans1=0,ans2=0,ans3=0,ans4=0;
	int i=0;
	while(s[i]!='\0')
	{
		char c=s[i];	
		if(c==' '||c=='\n'||c=='\r') ans2++;
		else if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) ans1++;
		else if(c>='0'&&c<='9') ans3++;
		else ans4++;
		i++;
	}
	printf("letter = %d, blank = %d, digit = %d, other = %d\n",ans1,ans2,ans3,ans4); 
}

习题6-2 使用函数求特殊a串数列和

int fn( int a, int n )
{
	int sum=0;
	for(int i=1;i<=n;i++)
	 sum=sum*10+a;
	return sum;
}
int SumA( int a, int n )
{
	int sum=0;
	for(int i=1;i<=n;i++)
	 sum+=fn(a,i);
	return sum;
}

习题6-3 使用函数输出指定范围内的完数

int factorsum( int number )
{
	int sum=0;
	for(int i=1;i<number;i++)
	if(number%i==0) sum+=i;
	return sum;
}
void PrintPN( int m, int n )
{
	int flag=1; 
	for(int i=m;i<=n;i++)
	if(factorsum(i)==i)
	{
		flag=0;
		printf("%d =",i);
		int cnt=0;
		for(int j=1;j<i;j++)
		if(i%j==0) cnt++;
		for(int j=1;j<i;j++)
		if(i%j==0)
		{
			cnt--;
			printf(" %d",j);
			if(cnt) printf(" +");
		}
		puts("");
	}
	if(flag) puts("No perfect number");
}

习题6-4 使用函数输出指定范围内的Fibonacci数

int fib( int n )
{
	int a=0,b=1,t;
    for(int i=2;i<=n;i++)
    {
        t=a+b;
        a=b;
        b=t;
    }
    return b;
}
void PrintFN( int m, int n )
{
	int flag=1;
	for(int i=1;fib(i)<=n;i++)
	if(fib(i)>=m)
	{
		if(flag) printf("%d",fib(i));
		else printf(" %d", fib(i));
		flag=0;
	}
	if(flag) puts("No Fibonacci number");
}

习题6-5 使用函数验证哥德巴赫猜想

int prime( int p )
{
	if(p<=1) return 0;
	if(p==2) return 1;
	for(int i=2;i*i<=p;i++)
	 if(p%i==0) return 0;
	return 1;
}
void Goldbach( int n )
{
	for(int i=2;i<=n;i++)
	 if(prime(i)&&prime(n-i)) 
	 {
	 	printf("%d=%d+%d",n,i,n-i);
	 	return;
	 }
}

习题6-6 使用函数输出一个整数的逆序数

int reverse( int number )
{
	int sum=0;
	do{
		sum=sum*10+number%10;
		number/=10;
	}while(number);
	return sum;
}

习题6-6 使用函数输出一个整数的逆序数

int reverse( int number )
{
	int sum=0;
	do{
		sum=sum*10+number%10;
		number/=10;
	}while(number);
	return sum;
}

习题6-7 简单计算器

#include 
int main()
{
    int i,sum,is=0;
    char op='0';
    scanf("%d",&sum);
    while(op!='=')
    {
        scanf("%c",&op);
        if(op=='=') break;
        scanf("%d",&i);
        if(op=='+') sum=sum+i;
        else if(op=='-') sum=sum-i;
        else if(op=='*') sum=sum*i;
        else if(op=='/')
        {
            if(i!=0) sum=sum/i;
            else is=1;
        }
        else is=1; 
    }
    if(is==1) printf("ERROR");
    else printf("%d\n",sum);    
    return 0;
}

习题6-8 单词首字母大写

#include
int main()
{
	int w=1;char c;
	while((c=getchar())!='\n')
	{
		if(c==' ')w=1;
		else if(w)
		{
			w=0;
			if(c>='a'&&c<='z')c-=32;
		}
		putchar(c);
	}
}

第七章

练习7-2 求最大值及其下标

#include
int main()
{
	int maxi,id;
	int n;
	scanf("%d\n",&n);
	for(int i=0;i<n;i++)
	{
		int x;
		scanf("%d",&x);
		if(i==0) maxi=x,id=i;
		else if(maxi<x) maxi=x,id=i; 
	}
	printf("%d %d\n",maxi,id);
	return 0;
}

练习7-3 将数组中的数逆序存放

#include 
int a[31],n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 scanf("%d",&a[i]);
	for(int i=n;i>=1;i--)
	 printf("%d%c",a[i],i==1?'\n':' ');
	return 0;
} 

练习7-4 找出不是两个数组共有的元素

#include 
int a[31],b[31],c[62],tot,n,m;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	 scanf("%d",&b[i]);
	for(int i=1;i<=n;i++)
	{
		int p=1;
		for(int j=1;j<=tot&&p;j++)
		 if(a[i]==c[j]) p=0;
		if(!p) continue;
		int flag=1;
		for(int j=1;j<=m&&flag;j++)
		 if(a[i]==b[j]) flag=0;
		if(flag) c[++tot]=a[i];
	}
	for(int i=1;i<=m;i++)
	{
		int p=1;
		for(int j=1;j<=tot&&p;j++)
		 if(b[i]==c[j]) p=0;
		if(!p) continue;
		int flag=1;
		for(int j=1;j<=n;j++)
		 if(b[i]==a[j]) flag=0;
		if(flag) c[++tot]=b[i];
	}
	for(int i=1;i<=tot;i++)
	{
	    if(i!=1) printf(" ");
		printf("%d",c[i]);		
	}
	 
	return 0;
} 

练习7-7 矩阵运算

#include 
int n,ans=0;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	 {
	 	int x;
		scanf("%d",&x);
		if(i==n||j==n||i==n-j+1) continue;
		ans+=x; 
	 }
	printf("%d\n",ans);
	return 0;
} 

练习7-8 方阵循环右移

#include 
int a[20][20],n,m;
int main()
{
	scanf("%d%d",&m,&n);
	m%=n;
	for(int i=0;i<n;i++)
	 for(int j=0;j<n;j++)
	  scanf("%d",&a[i][j]);
	for(int i=0;i<n;i++)
	{         
		for(int j=0;j<n;j++)             
		 printf("%d ",a[i][(n-m+j)%n]); 
		puts("");
	}    
	return 0;
} 

练习7-9 计算天数

#include 
int a[14]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
	int year,month,day;
	int ans=0;
	scanf("%d/%d/%d",&year,&month,&day);
	if(((year%4==0)&&(year%100))||(year%400==0)) a[2]++; 
	for(int i=1;i<month;i++) ans+=a[i];
	ans+=day;
	printf("%d\n",ans);
	return 0;
}

练习7-10 查找指定字符

#include 
#include 
char s[300],p[30];
int main()
{
	int len,id=-1;
	scanf("%s\n",p);
	for(int i=0;;i++)
	{
		char sp=getchar();
		if(sp=='\n') break;
		if(sp==p[0]) id=i;
	}
	if(id==-1) puts("Not Found");
	else printf("index = %d\n",id);
	return 0;
}

练习7-11 字符串逆序

#include 
#include 
char s[300],p[30];
int tot=0;
int main()
{
	for(int i=0;;i++)
	{
		char sp=getchar();
		if(sp=='\n') break;
		s[++tot]=sp;
	}
	for(int i=tot;i>=1;i--) printf("%c",s[i]);
	return 0;
}

习题7-1 选择法排序

#include 
#include 
int a[21];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 scanf("%d",&a[i]); 
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	  if(a[i]>a[j])
	  {
	  	int tmp=a[i];
	  	a[i]=a[j],a[j]=tmp;
	  }
	for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n?'\n':' ');
	return 0;
}

习题7-2 求一批整数中出现最多的个位数字

#include 
#include 
int a[20],ans;
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1,x;i<=n;i++)
	{
		scanf("%d",&x);
		do{
			a[x%10]++;
			x/=10;
		}while(x);
	}
	
	for(int i=0;i<=9;i++)
	 if(a[i]>ans) ans=a[i];
	printf("%d:",ans);
    for(int i=0;i<=9;i++)
     if(a[i]==ans) printf(" %d",i);
	return 0;
}

习题7-3 判断上三角矩阵

#include 
int t,n;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		int flag=1;
		for(int i=1;i<=n;i++)
		 for(int j=1,x;j<=n;j++)
		 {
			scanf("%d",&x);
			if(i>j&&x) flag=0;
		 }
		if(flag) puts("YES");
		else puts("NO");
	}
	return 0;
}

习题7-4 求矩阵各行元素之和

#include 
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		int sum=0;
		for(int j=1,x;j<=m;j++)
		 scanf("%d",&x),sum+=x;
		printf("%d\n",sum);
	}
	return 0;
}

习题7-5 找鞍点

#include
int n,a[6][6],row_max[6],col_min[6];  
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
     for(int j=0;j<n;j++)
      scanf("%d",&a[i][j]);
    for(int i=0;i<n;i++)
    {
        int row_max_index=0;
        for(int j=1;j<n;j++)
         if(a[i][row_max_index]<a[i][j]) row_max_index=j;
        row_max[i]=a[i][row_max_index];
    }
    for(int i=0;i<n;i++)
    {
        int col_min_index = 0;
        for(int j=1;j<n;j++)
         if(a[j][i]<a[col_min_index][i]) col_min_index=j;
        col_min[i]=a[col_min_index][i];
    }
   int count=0;
   for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    if(a[i][j]==row_max[i]&&a[i][j]==col_min[j])
    {
        printf("%d %d\n",i,j);
        count++;
    }
    if(count==0) printf("NONE\n");
    return 0;
}

习题7-6 统计大写辅音字母

#include
int main()
{
	char ch=0;
	int ans=0;
	while(1)
	{
		ch=getchar();
		if(ch=='\n') break;
		if(ch>='A'&&ch<='Z')
		 if(ch!='A'&&ch!='E'&&ch!='I'&&ch!='O'&&ch!='U') ans++;
	}
	printf("%d\n",ans);
	return 0;
}

习题7-7 字符串替换

#include
int main()
{
	char ch;
	int ans=0;
	while(1)
	{
		ch=getchar();
		if(ch=='\n') break;
		if(ch>='A'&&ch<='Z')
		 printf("%c",'Z'-ch+'A');
		else printf("%c",ch);
	}
	//printf("%d\n",ans);
	return 0;
}

习题7-8 字符串转换成十进制整数

#include
int main()
{
	char ch;
	int ans=0,flag=1,w=1;
	while(1)
	{
		ch=getchar();
		if(ch=='#') break;
		if(ch=='-'&&w) flag=-1;
		if(ch>='a'&&ch<='f') ans=ans*16+(ch-'a'+10),w=0;
		if(ch>='A'&&ch<='F') ans=ans*16+(ch-'A'+10),w=0;
		if(ch>='0'&&ch<='9') ans=ans*16+(ch-'0'),w=0;
	}
	printf("%d\n",flag*ans);
	return 0;
}

第八章

练习8-2 计算两数的和与差

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
	*psum=op1+op2;
	*pdiff=op1-op2;
}

练习8-8 移动字母

void Shift( char s[] )
{
	int len=strlen(s);
	char p1=s[0],p2=s[1],p3=s[2];
	for(int i=0;i<=len-4;i++)
	 s[i]=s[i+3];
	s[len-3]=p1,s[len-2]=p2,s[len-1]=p3;
}

习题8-1 拆分实数的整数与小数部分

void splitfloat( float x, int *intpart, float *fracpart )
{
	*intpart=(int)x;
	*fracpart=x-*intpart;
}

习题8-2 在数组中查找指定元素

int search( int list[], int n, int x )
{
	for(int i=0;i<n;i++)
	 if(list[i]==x) return i;
	return -1;
}

习题8-3 数组循环右移

void ArrayShift( int a[], int n, int m )
{
	int c[300],tot=0;
	m%=n;
	for(int i=n-m;i<n;i++) c[tot++]=a[i];
	for(int i=n-1;i>=m;i--) a[i]=a[i-m];
	for(int i=0;i<m;i++) a[i]=c[i];
}

习题8-4 报数

void CountOff( int n, int m, int out[] )
{
	int move,index=0;
	for(int i=0;i<n;i++) out[i]=0;
		
	for(int i=0;i<n;i++)
	{
		move=0;
		while(index>=0) 
		{
			index%=n;
			if(out[index]==0) 
				move++;
			if(move==m)
			{
				out[index]=i+1; 
				break;		
			}
			index++;	
		}

	}		
}

习题8-5 使用函数实现字符串部分复制

void strmcpy(char *t, int m, char *s)
{
    int len=0,i;
    char *p=t;
    while(*p!='\0') len++,p++;
    if(m<=len)
    {
        for(i=0;t[m-1+i]!='\0';i++) s[i]=t[m-1+i];
        s[i]='\0';
    }
    else *s='\0';
}

习题8-6 删除字符

void delchar( char *str, char c )
{
	char a[MAXN];
	int tot=0;
	for(int i=0;str[i]!='\0';i++)
	 if(str[i]!=c) a[tot++]=str[i];
	for(int i=0;i<tot;i++)
	 str[i]=a[i];
	str[tot]='\0';
}

习题8-7 字符串排序

#include 
#include 
char s[10][100];
int main()
{
	for(int i=1;i<=5;i++)
	 scanf("%s",s[i]);
	for(int i=1;i<=5;i++)
	 for(int j=2;j<=5;j++)
	  if(strcmp(s[j],s[j-1])<0)
	  {
	  	char tmp[100]; 
        strcpy(tmp,s[j-1]);
        strcpy(s[j-1],s[j]);
        strcpy(s[j],tmp);
	  }
	printf("After sorted:\n");
	for(int i=1;i<=4;i++) puts(s[i]);
	printf("%s",s[5]);
	return 0;
}

习题8-8 判断回文字符串

bool palindrome( char *s )
{
	int len=strlen(s);
	for(int i=0;i<len;i++)
	 if(s[i]!=s[len-1-i]) return 0;
	return 1;
}

习题8-9 分类统计各类字符个数

void StringCount( char *s )
{
	int ans1=0,ans2=0,ans3=0,ans4=0,ans5=0;
	for(int i=0;s[i]!='\0';i++)
	{
		if(s[i]>='A'&&s[i]<='Z') ans1++;
		else if(s[i]>='a'&&s[i]<='z') ans2++;
		else if(s[i]==' ') ans3++;
		else if(s[i]>='0'&&s[i]<='9') ans4++;
		else ans5++;
	}
	printf("%d %d %d %d %d\n",ans1,ans2,ans3,ans4,ans5);
}

习题8-10 输出学生成绩

#include 
#include 
int n;
int main()
{
	scanf("%d",&n);
	double sum=0,maxi=-1,mini=1e9;
	for(int i=1;i<=n;i++)
	{
		double x;
		scanf("%lf",&x);
		sum+=x;
		if(maxi<x) maxi=x;
		if(mini>x) mini=x;
	}
	printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf\n",sum/n,maxi,mini);
	return 0;
}

第九章

习题9-1 时间换算

#include 
#include 
int hh,mm,ss,t;
int main()
{
	scanf("%d:%d:%d",&hh,&mm,&ss);
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		ss++;
		if(ss==60) ss=0,mm++;
		if(mm==60) mm=0,hh++;
		if(hh==24) hh=0;
	}
	printf("%02d:%02d:%02d",hh,mm,ss);
	return 0;
}

习题9-2 计算两个复数之积

struct complex multiply(struct complex x, struct complex y)
{
	struct complex p;
	p.real=x.real*y.real-x.imag*y.imag;
	p.imag=x.real*y.imag+x.imag*y.real;
	return p;
}

习题9-3 平面向量加法

#include 
#include 
int main()
{
	double x1,x2,y1,y2;
	scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
	double p1=x1+x2,p2=y1+y2;
	if(fabs(p1)<0.05) p1=0;
	if(fabs(p2)<0.05) p2=0;
	printf("(%.1lf, %.1lf)",p1,p2);
	return 0;
} 

习题9-4 查找书籍

#include 
#include 
struct book{
    char name[31];
    double price;
}p[11];
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
	{
        gets(p[i].name);        
        scanf("%lf",&p[i].price);   
        getchar();
    }
    double max=-1,min=100;
    int maxid=0,minid=0;
    for(int i=0;i<n;i++)
	{
        if(p[i].price>max)
		{
            max=p[i].price;
            maxid=i;
        }
        if(p[i].price<min)
		{
            min=p[i].price;
            minid=i;
        }
    }
    printf("%.2f, %s\n",p[maxid].price,p[maxid].name);
    printf("%.2f, %s\n",p[minid].price,p[minid].name);
    return 0;
}

习题9-5 通讯录排序

#include 
#include 
struct list{
	char name[11],num[18];
	int date;
}p[22],temp;
int main()
{
	int n;
	scanf("%d",&n);
	getchar();
	for(int i=1;i<=n;i++)
	 scanf("%s %d %s",p[i].name,&p[i].date,p[i].num);
	for(int i=2;i<=n;i++)
	 for(int j=1;j<=n-i+1;j++)
	  if(p[j].date>p[j+1].date)
	  {     
        temp=p[j];
        p[j]=p[j+1];
        p[j+1]=temp;
      }
            
     for(int i=1;i<=n;i++) printf("%s %d %s\n",p[i].name,p[i].date,p[i].num); 
     return 0;
}

习题9-6 按等级统计学生成绩

int set_grade( struct student *p, int n )
{
	int tot=0;
	for(int i=0;i<n;i++)
	{
		if(p[i].score>=85&&p[i].score<=100) p[i].grade='A';
		if(p[i].score>=70&&p[i].score<=84) p[i].grade='B';
		if(p[i].score>=60&&p[i].score<=69) p[i].grade='C';
		if(p[i].score>=0&&p[i].score<=59) p[i].grade='D',tot++;
	}
	return tot;
}

第十章

练习10-1 使用递归函数计算1到n之和

int sum( int n )
{
	if(n<=0) return 0;
	if(n>0) return sum(n-1)+n;
}

习题10-1 判断满足条件的三位数

int search( int n )
{
	int sum=0;
	for(int i=1;i*i<=n;i++)
	 if(i*i>=101)
	 {
	 	int p1=(i*i)%10,p2=((i*i)/10)%10,p3=(i*i)/100;
	 	if((p1==p2&&p1!=p3)||(p1==p3&&p1!=p2)||(p2==p3&&p2!=p1)) sum++;
	 }
	return sum;
}

习题10-2 递归求阶乘和

double fact( int n )
{
	if(n==0) return 1;
	return fact(n-1)*n;
}
double factsum( int n )
{
	double sum=0;
	for(int i=1;i<=n;i++)
	 sum+=fact(i);
	return sum;
}

习题10-3 递归实现指数函数

double calc_pow( double x, int n )
{
	if(n==0) return 1;
	return calc_pow(x,n-1)*x;
}

习题10-4 递归求简单交错幂级数的部分和

double fn( double x, int n )
{
	if(n==0) return 0;
	double p=1;
	for(int i=1;i<=n;i++)
	 p*=x;
	return fn(x,n-1)+p*(n%2?1:-1);
}

习题10-5 递归计算Ackermenn函数

int Ack( int m, int n )
{
	if(m==0) return n+1;
	if(n==0) return Ack(m-1,1);
	return Ack(m-1,Ack(m,n-1));
}

习题10-6 递归求Fabonacci数列

int f( int n )
{
	if(n==0) return 0;
	if(n==1) return 1;
	return f(n-1)+f(n-2);
}

习题10-7 十进制转换二进制

void dectobin( int n )
{
	if(n==1)
	printf("1");
	if(n==0)
	printf("0");
	if(n>=2)
	{
		dectobin(n/2);
		printf("%d",n%2);
	}
}

习题10-8 递归实现顺序输出整数

void printdigits( int n )
{
	if(n<=9) printf("%d\n",n);
	else
	{
		printdigits(n/10);
		printf("%d\n",n%10);
	}
}

习题10-11 有序表的增删改查操作

int insert(int a[ ], int value)
{
	int i;
	for(i=0;i<Count;i++)
	 if(value==a[i]) return -1;
	for(i=0;i<Count;i++)
	 if(value<a[i]) break;
	for(int j=Count;j>i;j--)
     a[j]=a[j-1];
    a[i]=value;
    Count++;
    return 0;
} 
int del(int a[ ], int value)
{
	int i,flag=1;
	for(i=0;i<Count;i++)
	 if(value==a[i]) flag=0;
	if(flag) return -1;
	for(i=0;i<Count;i++)
	 if(value==a[i]) break;
	for(int j=i;j<Count;j++)
     a[j]=a[j+1];
    Count--;
    return 0;
}
int modify(int a[ ], int value1, int value2)
{
	if(del(a,value1)==-1) return -1;
    if(insert(a,value2)==-1) return -1;
    return 0;
}
int query(int a[ ], int value)
{
	int l=0,r=Count-1;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(a[mid]==value) return mid;
		else if(a[mid]>value) r=mid-1;
		else if(a[mid]<value) l=mid+1;
	}
	return -1;
}

第十一章

练习11-4 字符定位(最后一次找到的字符)

char *match(char *s, char ch)
{
	char *p=NULL;
	while(*s!='\0')
	{
		if(*s==ch) p=s;
		s++;
	}
	return p;
}

习题11-1 输出月份英文名

char *getmonth( int n )
{
	static char s[12][12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
	//s[1]={"January"},s[2]={"February"},s[3]={"March"},s[4]={"April"};
	char *ps=NULL;
	if(n>=1&&n<=12) return s[n-1];
	return ps;
}

习题11-2 查找星期

int getindex( char *s )
{
	static char ps[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"};
	for(int i=0;i<=6;i++)
	{
		int len=strlen(ps[i]);
		int L=strlen(s);
		int flag=1;
		if(L!=len) continue;
		for(int j=0;j<len;j++)
		 if(ps[i][j]!=s[j]) flag=0;
		if(flag) return i;
	} 
	return -1;
}

习题11-3 计算最长的字符串长度

int max_len( char *s[], int n )
{
	int max_lenx=0;
	for(int i=0;i<n;i++)
	 max_lenx=strlen(s[i])<max_lenx?max_lenx:strlen(s[i]);
	return max_lenx;
}

习题11-4 字符串的连接

char *str_cat( char *s, char *t )
{
	int len1=strlen(s),len2=strlen(t);
	for(int i=len1;i<=len1+len2;i++)
	 s[i]=t[i-len1];
	return s; 
}

习题11-5 指定位置输出字符串

char *match( char *s, char ch1, char ch2 )
{
	for(int i=0;i<strlen(s);i++)
	{
		if(s[i]==ch1)
		{
			for(int j=i;j<strlen(s);j++)
			{
				printf("%c",s[j]);
				if(s[j]==ch2)
				break;
			}
			printf("\n");
			return (s+i);
		}	
	}
	printf("\n");
	return s+strlen(s);
}

习题11-6 查找子串

char *search( char *s, char *t )
{
	int len1=strlen(s),len2=strlen(t);
	for(int i=0;i<len1;i++)
	{
		int flag=1;
		for(int j=0;j<len2;j++)
		 if(s[i+j]!=t[j]) flag=0;
		if(flag) return s+i;
	} 
	return NULL;
}

习题11-7 奇数值结点链表

struct ListNode *readlist()
{
	struct ListNode *head=NULL,*last=NULL;
	int n;
	while(1)
	{
		scanf("%d",&n);
		if(n==-1) break;
		struct ListNode *now=(struct ListNode *)malloc(sizeof(struct ListNode));
		if(head==NULL) head=now;
		now->data=n;
		now->next=NULL;
		if(last!=NULL) last->next=now;
		last=now;
	}
	return head;
}
struct ListNode *getodd(struct ListNode **L)
{
	struct ListNode *Even=NULL,*Odd=NULL,*pe,*po;
	while(*L)
	{
		int data=(*L)->data;
		struct ListNode *q=(struct ListNode *)malloc(sizeof(struct ListNode));
		q->data=data;
		q->next=NULL;
		if(data%2)
		{
			if(Odd) po->next=q;
			else Odd=q;
			po=q;
		}
		else
		{
			if(Even) pe->next=q;
			else Even=q;
			pe=q;
		}
		*L=(*L)->next;
	}
	*L=Even;
	return Odd;
}

习题11-8 单链表结点删除

struct ListNode *readlist()
{
	struct ListNode *head=NULL,*last=NULL;
	int n;
	while(1)
	{
		scanf("%d",&n);
		if(n==-1) break;
		struct ListNode *now=(struct ListNode *)malloc(sizeof(struct ListNode));
		if(head==NULL) head=now;
		now->data=n;
		now->next=NULL;
		if(last!=NULL) last->next=now;
		last=now;
	}
	return head;
}
struct ListNode *deletem( struct ListNode *L, int m )
{
	struct ListNode *head=L,*last=NULL;
	while(L)
	{
		//printf("%d\n",L->data);
		if(L->data==m)
		{
			if(last!=NULL) last->next=L->next;
			if(L==head) head=L->next;
			//free(L);
		}
		else last=L;
		L=L->next;
	}
	return head;
}

你可能感兴趣的:(c语言,算法,开发语言)