练习5-1 求m到n之和 (10 分)
int sum( int m, int n )
{
int res=0;
for(int i=m;i<=n;i++)
res+=i;
return res;
}
练习5-2 找两个数中最大者 (10 分)
int max( int a, int b )
{
return a>b?a:b;
}
练习5-3 数字金字塔 (15 分)
/* 你的代码将被嵌在这里 */
void pyramid( int n )
{
for(int i=1;i<=n;i++)
{
for(int t=0;t<n-i;t++)
printf(" ");
for(int k=0;k<i;k++)
printf("%-2d",i);
printf("\n");
}
}
习题5-1 符号函数 (10 分)
int sign(int x)
{
if(x>0)
return 1;
else if(x<0)
return -1;
else
return 0;
}
习题5-2 使用函数求奇数和 (15 分)
/* 你的代码将被嵌在这里 */
int even( int n )
{
if(n%2==0)
return 1;
else
return 0;
}
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 使用函数计算两点间的距离 (10 分)
/* 你的代码将被嵌在这里 */
double dist( double x1, double y1, double x2, double y2 )
{
return sqrt(pow(x2-x1,2)+pow(y2-y1,2));
}
习题5-4 使用函数求素数和 (20 分)
/* 你的代码将被嵌在这里 */
int prime( int p )
{
if(p<=1)
return 0;
else if(p==2)
return 1;
else
{
for(int i=2;i<=sqrt(p);i++)
{
if(p%i==0)
return 0;
}
return 1;
}
}
int PrimeSum( int m, int n )
{
int sum=0;
for(int k=m;k<=n;k++)
{
if(prime(k))
sum+=k;
}
return sum;
}
习题5-5 使用函数统计指定数字的个数 (15 分)
int CountDigit( int number, int digit )
{
if(number<0)
{
number*=-1;
}
int k=0;
do
{
if(number%10==digit)
k++;
number/=10;
} while(number);
return k;
}
习题5-6 使用函数输出水仙花数 (20 分)
/* 你的代码将被嵌在这里 */
int narcissistic( int number )
{
int num=number;
int n=0;
while(num)
{
num/=10;
n++;
}
double sum=0;
num=number;
while(num)
{
sum+=pow(num%10,n);
num/=10;
}
if(sum==number)
return 1;
else
return 0;
}
void PrintN( int m, int n )
{
for(int k=m;k<n;k++)
{
if(narcissistic(k))
printf("%d\n",k);
}
}
习题5-7 使用函数求余弦函数的近似值 (15 分)
/* 你的代码将被嵌在这里 */
double fact(int n);
double funcos( double e, double x )
{
int i=0,flag=1;
double sum=0,temp;
do{
temp=pow(x,i)/fact(i);
sum+=flag*temp;
i+=2;
flag*=-1;
}while(temp>=e);
return sum;
}
double fact(int n)
{
double sum=1;
for(int i=1;i<=n;i++)
sum*=i;
return sum;
}
习题6-1 分类统计字符个数 (15 分)
void StringCount( char s[] )
{
char c;
int letter=0,blank=0,digit=0,other=0;
for(int i=0;(c=s[i])!='\0';i++)
{
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
letter++;
else if(c==' '||c=='\n')
blank++;
else if(c>='0'&&c<='9')
digit++;
else
other++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
}
习题6-2 使用函数求特殊a串数列和 (20 分)
int fn( int a, int n )
{
int sum=0;
for(int i=0;i<n;i++)
{
sum+=a*pow(10,i);
}
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 使用函数输出指定范围内的完数 (20 分)
/* 你的代码将被嵌在这里 */
int factorsum( int number )
{
int sum=1;
for(int i=2;i<number;i++)
{
if(number%i==0)
sum+=i;
}
return sum;
}
void PrintPN( int m, int n )
{
int flag=0;
for(int k=m;k<=n;k++)
{
if(factorsum(k)==k)
{
flag=1;
printf("%d = %d",k,1);
for(int i=2;i<k;i++)
{
if(k%i==0)
printf(" + %d",i);
}
printf("\n");
}
}
if(flag==0)
printf("No perfect number");
}
习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)
/* 你的代码将被嵌在这里 */
int fib( int n )
{
if(n==1||n==2)
return 1;
else
{
int i=3;
int x=1,y=1;
while(i<=n)
{
int temp=y;
y+=x;
x=temp;
i++;
}
return y;
}
}
void PrintFN( int m, int n )
{
int i,c=0;
for(i=1;fib(i)<m;i++);
while(fib(i)<=n)
{
if(c==0)
printf("%d",fib(i));
else
printf(" %d",fib(i));
c++;
i++;
}
if(c==0)
printf("No Fibonacci number");
}
习题6-5 使用函数验证哥德巴赫猜想 (20 分)
/* 你的代码将被嵌在这里 */
int prime( int p )
{
if(p==1)
return 0;
else if(p==2)
return 1;
else
{
for(int i=2;i<=sqrt(p);i++)
{
if(p%i==0)
return 0;
}
return 1;
}
}
void Goldbach( int n )
{
for(int k=1;k<=n;k++)
{
if(prime(k)&&prime(n-k))
{
printf("%d=%d+%d",n,k,n-k);
break;
}
}
}
习题6-6 使用函数输出一个整数的逆序数 (20 分)
/* 你的代码将被嵌在这里 */
int reverse( int number )
{
int flag=1;
if(number<0){
number*=-1;
flag=-1;
}
int a[10],i=0;
while(number)
{
a[i++]=number%10;
number/=10;
}
double sum=0;
int l=i;
for(int k=0;k<i;k++)
{
sum+=a[k]*pow(10,--l);
}
return flag*sum;
}
练习8-2 计算两数的和与差 (10 分)
/* 你的代码将被嵌在这里 */
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2;
*pdiff=op1-op2;
}
练习8-8 移动字母 (10 分)
/* 你的代码将被嵌在这里 */
void Shift( char s[] )
{
char str1[80];
strncpy(str1,s,3);;
str1[3]='\0';
char str2[80];
strcpy(str2,s+3);
strcat(str2,str1);;
strcpy(s,str2);
}
习题8-1 拆分实数的整数与小数部分 (15 分)
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
习题8-2 在数组中查找指定元素 (15 分)
/* 你的代码将被嵌在这里 */
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 数组循环右移 (20 分)
/* 你的代码将被嵌在这里 */
int ArrayShift( int a[], int n, int m )
{
if(m>n)
m%=n;
sort(0,n-m-1,a);
sort(n-m,n-1,a);
sort(0,n-1,a);
}
void sort(int left,int right,int a[])
{
if(left>right)
return ;
else
{
for(int i=0;i<=(right-left)/2;i++)
{
int temp=a[left+i];
a[left+i]=a[right-i];
a[right-i]=temp;
}
}
}
习题8-4 报数 (20 分)
void CountOff( int n, int m, int out[] )
{
int i=0,j=0,k=0,cnt=0,a[MAXN];
for(i=0;i<n;i++)//n个人从1开始报数
a[i] = i+1;
i=0;
while(cnt < n)
{
if(a[i]!=0)//没有出局
k++;
if(k==m)//如果出局了
{
k=0;//重新归零
cnt++;
out[i]=cnt;//标记出局
a[i]=0;
}
i++;
if(i==n)
i=0;
}
}
习题8-5 使用函数实现字符串部分复制 (20 分)
/* 你的代码将被嵌在这里 */
void strmcpy( char *t, int m, char *s )
{
if(m>strlen(t))
s[0]='\0';
else
strcpy(s,t+m-1);
}
习题8-6 删除字符 (20 分)
/* 你的代码将被嵌在这里 */
void delchar( char *str, char c )
{
int k=0;
for(int i=0;str[i]!='\0';i++)
{
if(str[i]==c)
k++;
else
str[i-k]=str[i];
}
int l=strlen(str);
str[l-k]='\0';
}
习题8-8 判断回文字符串 (20 分)
/* 你的代码将被嵌在这里 */
bool palindrome( char *s )
{
int l=strlen(s);
for(int i=0;i<l/2;i++)
{
if(s[i]!=s[l-1-i])
return false;
}
return true;
}
习题8-9 分类统计各类字符个数 (15 分)
/* Your function will be put here */
void StringCount( char *s )
{
char c;
int Dletter,Lletter,blank,number,other;
Dletter=Lletter=blank=number=other=0;
for(int i=0;(c=s[i])!='\0';i++)
{
if(c>='A'&&c<='Z')
Dletter++;
else if(c>='a'&&c<='z')
Lletter++;
else if(c==' ')
blank++;
else if(c>='0'&&c<='9')
number++;
else
other++;
}
printf("%d %d %d %d %d",Dletter,Lletter,blank,number,other);
}
习题9-2 计算两个复数之积 (15 分)
/* 你的代码将被嵌在这里 */
struct complex multiply(struct complex x, struct complex y)
{
struct complex result;
result.real=x.real*y.real-x.imag*y.imag;
result.imag=x.real*y.imag+x.imag*y.real;
return result;
};
习题9-6 按等级统计学生成绩 (20 分)
/* 你的代码将被嵌在这里 */
int set_grade( struct student *p, int n )
{
int count=0;
for(int i=0;i<n;i++)
{
if(p[i].score>=85)
p[i].grade='A';
else if(p[i].score>=70)
p[i].grade='B';
else if(p[i].score>=60)
p[i].grade='C';
else
{
p[i].grade='D';
count++;
}
}
return count;
}
练习10-1 使用递归函数计算1到n之和 (10 分)
/* 你的代码将被嵌在这里 */
int sum( int n )
{
if(n<1)
return 0;
else if(n==0)
return 1;
else
return n+sum(n-1);
}
习题10-1 判断满足条件的三位数 (15 分)
/* 你的代码将被嵌在这里 */
int search(int n)
{
int count=0;
for(int k=101;k<=n;k++)
{
int l=sqrt(k);
if(l*l==k)
{
int a[3],num=k,i=0;
while(num)
{
a[i++]=num%10;
num/=10;
}
int c=0;
for(i=0;i<2;i++)
{
for(int j=i+1;j<3;j++)
{
if(a[i]==a[j])
c++;
}
}
if(c==1)
count++;
}
}
return count;
}
习题10-2 递归求阶乘和 (15 分)
/* 你的代码将被嵌在这里 */
double fact( int n )
{
if(n==0)
return 1;
else
return n*fact(n-1);
}
double factsum( int n )
{
double sum=0;
for(int k=1;k<=n;k++)
{
sum+=fact(k);
}
return sum;
}
习题10-3 递归实现指数函数 (15 分)
/* 你的代码将被嵌在这里 */
double calc_pow( double x, int n )
{
if(n==1)
return x;
else
return x*calc_pow(x,n-1);
}
习题10-4 递归求简单交错幂级数的部分和 (15 分)
/* 你的代码将被嵌在这里 */
double fn( double x, int n )
{
if(n==1)
return x;
else
return x*(1-fn(x,n-1));
}
习题10-5 递归计算Ackermenn函数 (15 分)
/* 你的代码将被嵌在这里 */
int Ack( int m, int n )
{
if(m==0)
return n+1;
else if(m>0&&n==0)
return Ack(m-1,1);
else if(m>0&&n>0)
return Ack(m-1,Ack(m,n-1));
}
习题10-6 递归求Fabonacci数列 (10 分)
/* 你的代码将被嵌在这里 */
int f( int n )
{
if(n==0)
return 0;
else if(n==1)
return 1;
else
return f(n-1)+f(n-2);
}
习题10-7 十进制转换二进制 (15 分)
/* 你的代码将被嵌在这里 */
void dectobin( int n )
{
if(n<2)
printf("%d",n);
else
{
dectobin(n/2);
printf("%d",n%2);
}
}
习题10-8 递归实现顺序输出整数 (15 分)
void printdigits( int n )
{
if(n<10)
printf("%d\n",n);
else
{
printdigits(n/10);
printf("%d\n",n%10);
}
}
习题11-1 输出月份英文名 (15 分)
/* 你的代码将被嵌在这里 */
char *getmonth( int n )
{
char *month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
if(n>12)
return NULL;
else
return month[n-1];
}
习题11-2 查找星期 (15 分)
/* 你的代码将被嵌在这里 */
int getindex( char *s )
{
char *web[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(int i=0;i<7;i++)
{
if(strcmp(s,web[i])==0)
return i;
}
return -1;
}
习题11-3 计算最长的字符串长度 (15 分)
/* 你的代码将被嵌在这里 */
int max_len( char *s[], int n )
{
int max=-121212;
for(int i=0;i<n;i++)
{
int l=strlen(s[i]);
if(l>max)
max=l;
}
return max;
}
习题11-4 字符串的连接 (15 分)
/* 你的代码将被嵌在这里 */
char *str_cat( char *s, char *t )
{
char *str;
str=strcat(s,t);
return str;
}
习题11-5 指定位置输出字符串 (20 分)
/* 你的代码将被嵌在这里 */
char *match( char *s, char ch1, char ch2 )
{
char *p;
int i=0;
for(i=0;s[i]!='\0'&&s[i]!=ch1;i++);
p=s+i;
while(s[i]!='\0')
{
printf("%c",s[i]);
if(s[i]==ch2)
break;
i++;
}
printf("\n");
return p;
}
习题11-6 查找子串 (20 分)
/* 你的代码将被嵌在这里 */
char *search( char *s, char *t )
{
int i=0,j=0;
while(s[i]!='\0'&&t[j]!='\0')
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(t[j]!='\0')
return NULL;
else
return s+i-strlen(t);
}
习题11-7 奇数值结点链表 (20 分)
/* 你的代码将被嵌在这里 */
typedef struct ListNode *List;
struct ListNode *readlist()
{
List Lhead=(List)malloc(sizeof(struct ListNode));
Lhead->next=NULL;
List rear=Lhead;
int a;
scanf("%d",&a);
while(a!=-1)
{
List s=(List)malloc(sizeof(struct ListNode));
s->next=NULL;
s->data=a;
rear->next=s;
rear=s;
scanf("%d",&a);
}
rear->next=NULL;
return Lhead->next;
};
struct ListNode *getodd( struct ListNode **L )
{
List OddHead=(List)malloc(sizeof(struct ListNode));
List Lhead=(List)malloc(sizeof(struct ListNode));
Lhead->next=*L;
List Orear=OddHead;
List pre=Lhead,p=*L;
List q;
while(p)
{
if(p->data%2!=0)
{
q=p;
p=p->next;
pre->next=p;
Orear->next=q;
Orear=q;
}
else
{
pre=p;
p=p->next;
}
}
*L=Lhead->next;
Orear->next=NULL;
return OddHead->next;
};
习题11-8 单链表结点删除 (20 分)
/* 你的代码将被嵌在这里 */
typedef struct ListNode *List;
struct ListNode *readlist()
{
List Lhead=(List)malloc(sizeof(struct ListNode));
Lhead->next=NULL;
List rear=Lhead;
int a;
scanf("%d",&a);
while(a!=-1)
{
List s=(List)malloc(sizeof(struct ListNode));
s->data=a;
s->next=NULL;
rear->next=s;
rear=s;
scanf("%d",&a);
}
return Lhead->next;
};
struct ListNode *deletem( struct ListNode *L, int m )
{
List Lhead=(List)malloc(sizeof(struct ListNode));
Lhead->next=L;
List pre=Lhead,p=Lhead->next,q;
while(p)
{
if(p->data==m)
{
q=p;
p=p->next;
pre->next=p;
free(q);
}else
{
pre=p;
p=p->next;
}
}
return Lhead->next;
};
练习2-1 Programming in C is fun! (5 分)
#include<stdio.h>
int main()
{
printf("Programming in C is fun!");
}
练习2-3 输出倒三角图案 (5 分)
#include
int main(){
printf("* * * *\n");
printf(" * * *\n");
printf(" * *\n");
printf(" *\n");
}
练习2-4 温度转换 (5 分)
#include
int main()
{
int c=5*(150-32)/9;
printf("fahr = 150, celsius = %d",c);
}
练习2-6 计算物体自由下落的距离 (5 分)
#include
int main()
{
double height=0.5*10*9;
printf("height = %.2lf",height);
}
练习2-8 计算摄氏温度 (10 分)
#include
int main()
{
int f;
scanf("%d",&f);
int c=5*(f-32)/9;
printf("Celsius = %d",c);
}
练习2-9 整数四则运算 (10 分)
#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);
}
练习2-10 计算分段函数[1] (10 分)
#include
int main()
{
double x;
scanf("%lf",&x);
if(x==0)
printf("f(%.1lf) = %.1lf",x,0);
else
printf("f(%.1lf) = %.1lf",x,1.0/x);
}
练习2-11 计算分段函数[2] (10 分)
#include
#include
int main()
{
double x,res;
scanf("%lf",&x);
if(x>=0)
{
res=sqrt(x);
}
else
{
res=pow(x+1,2)+2*x+1/x;
}
printf("f(%.2lf) = %.2lf",x,res);
}
练习2-12 输出华氏-摄氏温度转换表 (15 分)
#include
int main()
{
int lower,upper;
scanf("%d %d",&lower,&upper);
if(lower>upper){
printf("Invalid.");
}else{
printf("fahr celsius\n");
for(int k=lower;k<=upper;k+=2)
{
double c=5*(k-32)/9;
printf("%d%6.1lf\n",k,c);
}
}
}
练习2-13 求N分之一序列前N项和 (15 分)
#include
int main()
{
int N;
double sum=0;
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
sum+=(1.0/i);
}
printf("sum = %.6lf",sum);
}
练习2-14 求奇数分之一序列前N项和 (15 分)
#include
int main()
{
int N;
scanf("%d",&N);
int c=1;
double sum=0;
for(int k=1;c<=N;k+=2)
{
sum+=(1.0/k);
c++;
}
printf("sum = %.6lf",sum);
}
练习2-15 求简单交错序列前N项和 (15 分)
#include
int main()
{
int N,f=1;
scanf("%d",&N);
int c=1;
double sum=0;
for(int i=1;c<=N;i+=3)
{
sum+=(f*1.0/i);
f*=-1;
c++;
}
printf("sum = %.3lf",sum);
}
练习2-17 生成3的乘方表 (15 分)
#include
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<=n;i++)
{
printf("pow(3,%d) = %.0lf\n",i,pow(3,i));
}
}
练习2-18 求组合数 (15 分)
#include
double fact(int);
int main()
{
int m,n;
scanf("%d %d",&m,&n);
double res=fact(n)/fact(m)/fact(n-m);
printf("result = %.0lf",res);
}
double fact(int n)
{
double sum=1;
for(int i=1;i<=n;i++)
sum*=i;
return sum;
}
习题2-1 求整数均值 (10 分)
#include
int main()
{
int a;
double sum=0;
for(int i=0;i<4;i++)
{
scanf("%d",&a);
sum+=a;
}
double ave=sum/4;
printf("Sum = %.0lf; Average = %.1lf",sum,ave);
}
习题2-2 阶梯电价 (15 分)
#include
int main()
{
int d;
double price;
scanf("%d",&d);
if(d<0)
{
printf("Invalid Value!");
return 0;
}
else if(d<=50)
price=d*0.53;
else
price=50*0.53+(d-50)*0.58;
printf("cost = %.2lf",price);
}
习题2-3 求平方与倒数序列的部分和 (15 分)
#include
int main()
{
int m,n;
scanf("%d %d",&m,&n);
double sum=0;
for(int k=m;k<=n;k++)
{
sum+=(pow(k,2)+1.0/k);
}
printf("sum = %.6lf",sum);
}
习题2-4 求交错序列前N项和 (15 分)
#include
int main()
{
int N;
scanf("%d",&N);
double temp,f=1;
double k=1,t=1,sum=0;
while(k<=N)
{
temp=f*k/t;
sum+=temp;
f*=-1;
k++;
t+=2;
}
printf("%.3lf",sum);
}
习题2-5 求平方根序列前N项和 (15 分)
#include
#include
int main()
{
int N;
scanf("%d",&N);
double sum=0;
for(int k=1;k<=N;k++)
{
sum+=sqrt(k);
}
printf("sum = %.2lf",sum);
}
习题2-6 求阶乘序列前N项和 (15 分)
#include
int fact(int n)
{
int sum=1;
for(int k=1;k<=n;k++)
sum*=k;
return sum;
}
int main()
{
int N,sum=0;
scanf("%d",&N);
for(int k=1;k<=N;k++)
sum+=fact(k);
printf("%d",sum);
}
练习3-2 计算符号函数的值 (10 分)
#include
int main()
{
int n;
scanf("%d",&n);
if(n<0)
printf("sign(%d) = -1",n);
else if(n==0)
printf("sign(%d) = 0",n);
else
printf("sign(%d) = 1",n);
}
练习3-3 统计学生平均成绩与及格人数 (15 分)
#include
int main()
{
int n,a;
int count=0,average,sum=0;
scanf("%d",&n);
if(n==0)
{
printf("average = %.1lf\ncount = %d",0,count);
return 0;
}
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(a>=60)
count++;
sum+=a;
}
printf("average = %.1lf\ncount = %d",sum*1.0/n,count);
}
练习3-4 统计字符 (15 分)
#include
int main()
{
char c;
int letter=0,blank=0,digit=0,other=0;
for(int i=0;i<10;i++)
{
c=getchar();
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
letter++;
else if(c==' '||c=='\n')
blank++;
else if(c>='0'&&c<='9')
digit++;
else
other++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
}
练习3-5 输出闰年 (15 分)\
#include
int main()
{
int n;
scanf("%d",&n);
if(n>2100||n<=2000)
{
printf("Invalid year!");
return 0;
}
int c=0;
for(int k=2001;k<=n;k++)
{
if((k%4==0&&k%100!=0)||(k%400==0))
{
printf("%d\n",k);
c++;
}
}
if(c==0)
printf("None");
}
练习3-7 成绩转换 (15 分)
#include
int main()
{
int n;
scanf("%d",&n);
int a=n/10;
char c;
switch(a)
{
case 10:
case 9:
c='A';
break;
case 8:
c='B';
break;
case 7:
c='C';
break;
case 6:
c='D';
break;
default:
c='E';
}
printf("%c",c);
}
练习3-8 查询水果价格 (15 分)
#include
int main()
{
printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
int a;
double price;
for(int i=0;i<5;i++)
{
scanf("%d",&a);
switch(a)
{
case 1:
price=3;
break;
case 2:
price=2.5;
break;
case 3:
price=4.1;
break;
case 4:
price=10.2;
break;
case 0:
return 0;
break;
default:
price=0;
}
printf("price = %.2lf\n",price);
}
return 0;
}
习题3-1 比较大小 (10 分)
#include
int main()
{
int a[3];
for(int i=0;i<3;i++)
scanf("%d",&a[i]);
for(int i=1;i<3;i++)
{
for(int j=0;j<3-i;j++)
{
if(a[j+1]<a[j])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("%d",a[0]);
for(int i=1;i<3;i++)
{
printf("->%d",a[i]);
}
}
习题3-2 高速公路超速处罚 (15 分)
#include
int main()
{
int s,lims;
scanf("%d %d",&s,&lims);
double rate=(s-lims)*1.0/lims*100;
if(rate<10)
{
printf("OK");
}
else if(rate<50)
{
printf("Exceed %.0lf%%. Ticket 200",rate);
}
else
printf("Exceed %.0lf%%. License Revoked",rate);
}
习题3-3 出租车计价 (15 分)
#include
int main()
{
double d;int t;
scanf("%lf %d",&d,&t);
double tprice=0,dprice=0;
tprice+=(t/5*2);
double temp;
if(d<=3)
{
temp=10;
}
else if(d<=10)
{
temp=10+(d-3)*2;
}
else
{
temp=10+7*2+(d-10)*3;
}
dprice+=temp;
printf("%.0lf",dprice+tprice);
}
习题3-4 统计学生成绩 (15 分)
#include
int main()
{
int A=0,B=0,C=0,D=0,E=0;
int N,a;
scanf("%d",&N);
for(int i=0;i<N;i++)
{
scanf("%d",&a);
switch(a/10)
{
case 10:
case 9:
A++;
break;
case 8:
B++;
break;
case 7:
C++;
break;
case 6:
D++;
break;
default:
E++;
}
}
printf("%d %d %d %d %d",A,B,C,D,E);
}
习题3-5 三角形判断 (15 分)
#include
int main()
{
double x1,y1,x2,y2,x3,y3;
scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
double a=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
double b=sqrt(pow(x3-x2,2)+pow(y3-y2,2));
double c=sqrt(pow(x3-x1,2)+pow(y3-y1,2));
if(a+b>c&&a+c>b&&b+c>a)
{
double h=a+b+c;
double l=h/2;
double area=sqrt(l*(l-a)*(l-b)*(l-c));
printf("L = %.2lf, A = %.2lf",h,area);
}
else
{
printf("Impossible");
}
return 0;
}
练习4-3 求给定精度的简单交错序列部分和 (15 分)
#include
int main()
{
double eps;
int k=1,f=1;
scanf("%lf",&eps);
double sum=0,temp;
do{
temp=1.0/k;
sum+=f*temp;
f*=-1;
k+=3;
}while(temp>eps);
printf("sum = %.6lf",sum);
}
练习4-6 猜数字游戏 (15 分)
#include
int main()
{
int ran,n;
scanf("%d %d",&ran,&n);
int a;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(a<0)
break;
else if(a>ran)
printf("Too big\n");
else if(a<ran)
printf("Too small\n");
else
{
if(i==1)
printf("Bingo!");
else if(i==2||i==3)
printf("Lucky You!\n");
else if(i<=n)
printf("Good Guess!\n");
return 0;
}
}
printf("Game Over");
return 0;
}
练习4-7 求e的近似值 (15 分)
#include
double fact(int);
int main()
{
int n;
scanf("%d",&n);
double sum=1;
for(int k=1;k<=n;k++)
sum+=1/fact(k);
printf("%.8lf",sum);
}
double fact(int n)
{
double sum=1;
for(int i=1;i<=n;i++)
sum*=i;
return sum;
}
练习4-10 找出最小值 (20 分)
#include
int main()
{
int n,a;
scanf("%d",&n);
int min=121212;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(a<min)
min=a;
}
printf("min = %d",min);
}
练习4-11 统计素数并求和 (20 分)\
#include
int prime(int);
int main()
{
int m,n;
scanf("%d %d",&m,&n);
int sum=0,count=0;
for(int k=m;k<=n;k++)
{
if(prime(k)){
sum+=k;
count++;
}
}
printf("%d %d",count,sum);
}
int prime(int n)
{
if(n==1)
return 0;
else if(n==2)
return 1;
else
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
}
习题4-1 求奇数和 (15 分)
#include
int main()
{
int sum=0;
int a;
scanf("%d",&a);
while(a>0)
{
if(a%2!=0){
sum+=a;
}
scanf("%d",&a);
}
printf("%d",sum);
}
习题4-2 求幂级数展开的部分和 (20 分)
#include
double fact(int);
int main()
{
double x,temp;
scanf("%lf",&x);
int i=0;
double sum=0;
do{
temp=pow(x,i)/fact(i);
sum+=temp;
i++;
}while(temp>=0.0000110);
printf("%.4lf",sum);
}
double fact(int n)
{
if(n==0)
return 1;
else
{
double sum=1;
for(int i=1;i<=n;i++)
sum*=i;
return sum;
}
}
习题4-3 求分数序列前N项和 (15 分)
#include
int main()
{
int c=1,N;
scanf("%d",&N);
double x=2,y=1;
double temp,sum=0;
while(c<=N)
{
sum+=(x/y);
temp=x;
x+=y;
y=temp;
c++;
}
printf("%.2lf",sum);
}
习题4-4 特殊a串数列求和 (20 分)
#include
int main()
{
int a,n;
scanf("%d %d",&a,&n);
int sum=0;
for(int k=1;k<=n;k++)
sum+=fact(k,a);
printf("s = %d",sum);
}
int fact(int n,int a)
{
double sum=0;
for(int i=0;i<n;i++)
sum+=a*pow(10,i);
return sum;
}
习题4-5 换硬币 (20 分)
#include
int main()
{
int n,count=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(5*i+2*j+k==n)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);
count++;
}
printf("count = %d",count);
}
习题4-6 水仙花数 (20 分)
#include<stdio.h>
int Judge(int ,int);
int power(int ,int);
int main()
{
int n;
scanf("%d",&n);
int x=power(10,n-1);
int s=power(10,n);
for(int k=x;k<s;k++)
{
if(Judge(k,n))
printf("%d\n",k);
}
return 0;
}
int Judge(int num,int b)
{
double sum=0;
int t,n=num;
while(num)
{
t=num%10;
sum+=power(t,b);
num/=10;
}
if(sum==n)
return 1;
else
return 0;
}
int power(int d,int z)
{
int sum=1;
for(int i=1;i<=z;i++)
sum*=d;
return sum;
}
习题4-7 最大公约数和最小公倍数 (15 分)
#include<stdio.h>
int main()
{
int m,n;
scanf("%d %d",&m,&n);
int x=m,y=n;
while(y)
{
int temp=x%y;
x=y;
y=temp;
}
printf("%d %d",x,m*n/x);
}
习题4-8 高空坠球 (20 分)
#include<stdio.h>
int main()
{
int height,n;
scanf("%d %d",&height,&n);
if(n==0)
{
printf("%.1lf %.1lf",0,0);
return 0;
}
double sum=height,h=height;
int i=1;
while(i<n)
{
sum+=h;
h/=2;
i++;
}
printf("%.1lf %.1lf",sum,h/2);
}
习题4-9 打印菱形图案 (15 分)
#include
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=(n+1)/2;i++)
{
for(int l=1;l<=(n+1)/2-i;l++)
printf(" ");
for(int k=1;k<=2*i-1;k++)
printf("* ");
printf("\n");
}
for(int i=1;i<=n/2;i++)
{
for(int l=1;l<=i;l++)
printf(" ");
for(int k=1;k<=n-2*i;k++)
printf("* ");
printf("\n");
}
return 0;
}
习题4-10 猴子吃桃问题 (15 分)
#include
int main()
{
int N;
scanf("%d",&N);
printf("%d",sum(N));
}
int sum(int n)
{
if(n==1)
return 1;
else
return 2*(sum(n-1)+1);
}
习题4-11 兔子繁衍问题 (15 分)
#include
int main()
{
int N;
scanf("%d",&N);
if(N==1)
{
printf("1");
return 0;
}
int x=1,y=1;
int i=2;
while(y<N)
{
int temp=y;
y+=x;
x=temp;
i++;
}
printf("%d",i);
}
习题6-7 简单计算器 (20 分)
#include
int main()
{
int a,b;
int sum=0;
char c;
scanf("%d",&a);
sum=a;
scanf("%c",&c);
while(c!='=')
{
scanf("%d",&b);
switch(c)
{
case '+':
sum+=b;
break;
case '-':
sum-=b;
break;
case '*':
sum*=b;
break;
case '/':
if(b==0)
{
printf("ERROR");
return 0;
}
sum/=b;
break;
default:
printf("ERROR");
return 0;
}
scanf("%c",&c);
}
printf("%d",sum);
}
习题6-8 统计一行文本的单词个数 (15 分)
#include
int main()
{
char s[1000];
gets(s);
char c;
int num=0,word=0;
for(int i=0;(c=s[i])!='\0';i++)
{
if(c==' ')
word=0;
else if(word==0)
{
num++;
word=1;
}
}
printf("%d",num);
}
练习7-2 求最大值及其下标 (20 分)
#include
int main()
{
int l,n,a;
scanf("%d",&n);
int max=-121212;
for( int i=0;i<n;i++)
{
scanf("%d",&a);
if(a>max)
{
l=i;
max=a;
}
}
printf("%d %d",max,l);
}
练习7-3 将数组中的数逆序存放 (20 分)
#include
int main()
{
int n;
scanf("%d",&n);
int a[15];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n/2;i++)
{
int temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}
printf("%d",a[0]);
for(int i=1;i<n;i++)
printf(" %d",a[i]);
}
练习7-4 找出不是两个数组共有的元素 (20 分)
#include
int main()
{
int al,bl;
int a[30],b[30],c[30];
scanf("%d",&al);
for(int i=0;i<al;i++)
scanf("%d",&a[i]);
scanf("%d",&bl);
for(int i=0;i<bl;i++)
scanf("%d",&b[i]);
int i,j,k=0;
for(i=0;i<al;i++)
{
for(j=0;j<bl;j++)
{
if(a[i]==b[j])
break;
}
if(j==bl)
c[k++]=a[i];
}
for(j=0;j<bl;j++)
{
for(i=0;i<al;i++)
{
if(a[i]==b[j])
break;
}
if(i==al)
c[k++]=b[j];
}
//去重复元素
printf("%d",c[0]);
for(i=1;i<k;i++)
{
for(j=0;j<i;j++)
{
if(c[i]==c[j])
break;
}
if(j==i)
{
printf(" %d",c[i]);
}
}
}
练习7-7 矩阵运算 (20 分)
#include
int main()
{
int i,j,n;
scanf("%d",&n);
int a[20][20];
int sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
sum+=a[i][j];
}
}
int fu=0,zl=0;
for(i=0;i<n;i++)
{
fu+=a[i][n-1-i];
zl+=a[i][n-1];
}
int zh=0;
for(j=0;j<n;j++)
zh+=a[n-1][j];
sum=sum-fu-zl-zh+a[0][n-1]+a[n-1][0]+a[n-1][n-1];
printf("%d",sum);
}
练习7-8 方阵循环右移 (20 分)
//思路:不用改变矩阵,只要改变矩阵的输出顺序就可以
#include
int main(){
int m,n;
scanf("%d %d",&m,&n);
int a[6][6];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
m%=n;//当m大于n时,移动3次恢复原位,所欲取余,相当于移动m%n步
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ",a[i][(n-m+j)%n]);//这里的(n-m+j)%n记住
}
printf("\n");
}
}
练习7-9 计算天数 (15 分)
#include
int main(){
int year,month,day,flag=0;
scanf("%d/%d/%d",&year,&month,&day);
//判断是不是闰年
if((year%4==0&&year%100!=0)||(year%400)==0){
flag=1;
}
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int sum=0;
for(int i=0;i<month-1;i++){
sum+=mon[i];
if(i==1&&flag==1){
sum+=1;
}
}
printf("%d",sum+day);
}
练习7-10 查找指定字符 (15 分)
#include
#include
int main()
{
char c=getchar();
getchar();
char s[81];
gets(s);
int i;
for(i=strlen(s);i>=0;i--)
if(s[i]==c)
{
printf("index = %d",i);
return 0;
}
if(i==-1)
printf("Not Found");
return 0;
}
练习7-11 字符串逆序 (15 分)
#include
int main()
{
char s[1000];
gets(s);
int l=strlen(s);
for(int i=0;i<l/2;i++)
{
char c=s[i];
s[i]=s[l-1-i];
s[l-1-i]=c;
}
puts(s);
}
习题7-1 选择法排序 (20 分)
#include
int main()
{
int n,a[15];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int k=0;k<n-1;k++)
{
int l=k;
for(int j=k+1;j<n;j++)
{
if(a[j]>a[l])
l=j;
}
if(k!=l)
{
int temp=a[k];
a[k]=a[l];
a[l]=temp;
}
}
printf("%d",a[0]);
for(int i=1;i<n;i++)
printf(" %d",a[i]);
}
习题7-2 求一批整数中出现最多的个位数字 (20 分)
#include
int main()
{
int N;
scanf("%d",&N);
int a[10];
for(int i=0;i<10;i++)
a[i]=0;
int num;
for(int i=0;i<N;i++)
{
scanf("%d",&num);
while(num)
{
a[num%10]++;
num/=10;
}
}
int max=-12312;
for(int i=0;i<10;i++)
{
if(a[i]>max)
max=a[i];
}
printf("%d:",max);
for(int i=0;i<10;i++)
{
if(a[i]==max)
printf(" %d",i);
}
}
习题7-3 判断上三角矩阵 (15 分)
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
int a[15][15];
for(int i=0;i<T;i++)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
int flag=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i>j&&a[i][j]!=0){
flag=1;
}
}
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
}
习题7-4 求矩阵各行元素之和 (15 分)
#include<stdio.h>
int main()
{
int m,n,i,j;
int a[10][10];int b[10];
int sum=0;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
{
sum=0;
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
sum+=a[i][j];
}
b[i]=sum;
}
for(int t=0;t<i;t++)
printf("%d\n",b[t]);
return 0;
}
习题7-5 找鞍点 (20 分)
#include
int main()
{
int n,a[100][100];
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 maxl,max=-12121;
for(int j=0;j<n;j++)
{
if(a[i][j]>=max)
{
max=a[i][j];
maxl=j;
}
}
int minl,min=121122;
for(int t=0;t<n;t++)
{
if(a[t][maxl]<=min)
{
min=a[t][maxl];
minl=t;
}
}
if(minl==i)
{
printf("%d %d",minl,maxl);
return 0;
}
}
printf("NONE");
}
习题7-6 统计大写辅音字母 (15 分)
#include
int main()
{
char s[100];
int c=0;
gets(s);
for(int i=0;s[i]!='\0';i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
if(s[i]!='A'&&s[i]!='E'&&s[i]!='I'&&s[i]!='O'&&s[i]!='U')
{
c++;
}
}
}
printf("%d",c);
}
习题7-7 字符串替换 (15 分)
#include
int main()
{
char s[100];
gets(s);
for(int i=0;s[i]!='\0';i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
s[i]='A'+'Z'-s[i];
}
}
puts(s);
}
习题7-8 字符串转换成十进制整数 (15 分)
#include
int main()
{
char a[100],b[100],c[100];
gets(a);
int i,j=0;
for(i=0;a[i]!='\0';i++)
{
if((a[i]=='-')||(a[i]>='0'&&a[i]<='9')||(a[i]>='a'&&a[i]<='f')||(a[i]>='A'&&a[i]<='F'))
b[j++]=a[i];
}
b[j]='\0';
int f=1;
if(b[0]=='-')
f=-1;
int k,t=0;
for(k=0;b[k]!='\0';k++)
{
if((b[k]>='0'&&b[k]<='9')||(b[k]>='a'&&b[k]<='f')||(b[k]>='A'&b[k]<='F'))
c[t++]=b[k];
}
c[t]='\0';
double sum=0;
int temp;
for(int h=0;c[h]!='\0';h++)
{
if(c[h]>='0'&&c[h]<='9')
temp=c[h]-'0';
else if(c[h]>='A'&&c[h]<='F')
temp=c[h]-'A'+10;
else if(c[h]>='a'&&c[h]<='f')
temp=c[h]-'a'+10;
sum+=temp*pow(16,--t);
}
if(sum==0)
printf("%.0lf",sum);
else
printf("%.0lf",f*sum);
}
习题8-7 字符串排序 (20 分)
#include
int main()
{
char *s[5];
char str[100];
for(int i=0;i<5;i++)
{
scanf("%s",&str);
s[i]=(char*)malloc(sizeof(char)*(strlen(str)+1));
strcpy(s[i],str);
}
for(int i=1;i<5;i++)
{
for(int j=0;j<5-i;j++)
{
if(strcmp(s[j],s[j+1])>0)
{
char *temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
printf("After sorted:\n");
for(int i=0;i<5;i++)
printf("%s\n",s[i]);
}
习题8-10 输出学生成绩 (20 分)
#include
int main()
{
int n;
scanf("%d",&n);
double a,sum=0,max=-1212,min=12121;
for(int i=0;i<n;i++)
{
scanf("%lf",&a);
sum+=a;
if(a>max)
max=a;
if(a<min)
min=a;
}
double average=sum/n;
printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",average,max,min);
}
习题9-1 时间换算 (15 分)
#include
int main()
{
int h,m,s,n;
scanf("%d:%d:%d",&h,&m,&s);
scanf("%d",&n);
s+=n;
if(s>59)
{
m+=(s/60);
s=s%60;
if(m>59)
{
h+=(m/60);
m=m%60;
if(h>23)
h=0;
}
}
printf("%02d:%02d:%02d",h,m,s);
}
习题9-3 平面向量加法 (15 分)
#include
int main()
{
double x1,y1,x2,y2;
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
double x=x1+x2;
double y=y1+y2;
if(fabs(x)<0.05)
x=0;
if(fabs(y)<0.05)
y=0;
printf("(%.1lf, %.1lf)",x,y);
}
习题9-4 查找书籍 (20 分)
struct book
{
char name[50];
double price;
};
int main()
{
int n;
scanf("%d",&n);
struct book b[n];
for(int i=0;i<n;i++)
{
getchar();
gets(b[i].name);
scanf("%lf",&b[i].price);
}
struct book t;
for(int i=1;i<n;i++)
{
for(int j=0;j<n-1;j++)
{
if(b[j].price>b[j+1].price)
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
printf("%.2lf, %s\n",b[n-1].price,b[n-1].name);
printf("%.2lf, %s\n",b[0].price,b[0].name);
}
习题9-5 通讯录排序 (20 分)
#include
struct TNode
{
char name[20];
int birth;
char phone[20];
};
int main()
{
int N;
struct TNode T[10];
scanf("%d",&N);
for(int i=0;i<N;i++)
{
getchar();
scanf("%s %d %s",T[i].name,&T[i].birth,T[i].phone);
}
for(int i=0;i<N-1;i++)
{
int k=i;
for(int j=i+1;j<N;j++)
{
if(T[j].birth<T[k].birth)
k=j;
}
if(k!=i)
{
struct TNode temp=T[k];
T[k]=T[i];
T[i]=temp;
}
}
for(int i=0;i<N;i++)
printf("%s %d %s\n",T[i].name,T[i].birth,T[i].phone);
}