第二章
练习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;
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;
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);
}
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"};
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)
{
if(L->data==m)
{
if(last!=NULL) last->next=L->next;
if(L==head) head=L->next;
}
else last=L;
L=L->next;
}
return head;
}