c语言程序设计精髓 第9周练兵题

1二分法求根(4分)

c语言程序设计精髓 第9周练兵题_第1张图片

 #include 
#include 
#include 
float Calc(float x);
int main()
{
    float a,b,c,d,e;
    scanf("%f,%f",&a,&b);
    do{
        c=(a+b)/2;
        d=Calc(a);
        e=Calc(c);
        if(d*e ==0){
            break;
        }else if(d*e>0){
            a=c;
        }else{
            b=c;
        }
    }while(e<-0.000001 || e>0.000001);
    printf("x=%6.2f\n",c);

}
float Calc(float x){
    return x*x*x-x-1;
}

2矩阵转置(4分)

题目内容:

某二维数组存放的数据构成一个nn的方阵,其中n<=5。写程序,从键盘输入n的值(n<=5),该nn矩阵中各元素的值按下面的公式计算:

a[i][j] = i * n + j + 1

其中,a[i][j]表示第i行第j列的元素。要求分别输出该矩阵和它的转置矩阵。

注意:定义数字大小N时,请用

#define N 10

输入格式: “%d”

输出提示:“The original matrix is:\n”

输出提示:“The changed matrix is:\n”

输出格式: 矩阵的列与列之间为%3d,行与行之间为\n

输入样例1:

5↙

输出样例1:

The_original_matrix_is:

__1__2__3__4__5

__6__7__8__9_10

_11_12_13_14_15

_16_17_18_19_20

_21_22_23_24_25

The_changed_matrix_is:

__1__6_11_16_21

__2__7_12_17_22

__3__8_13_18_23

__4__9_14_18_24

__5_10_15_20_25

(输出样例中下划线“_”代表空格)

输入样例2:

4↙

输出样例2:

The original matrix is:

__1__2__3__4

__5__6__7__8

__9_10_11_12

_13_14_15_16

The changed matrix is:

__1__5__9_13

__2__6_10_14

__3__7_11_15

__4__8_12_16

注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!

(输出样例中下划线“_”代表空格)

 #include 
#include 
#include 
#define N 10

int main()
{
    int a[N][N]={0},b,c=0;
    scanf("%d",&b);
    printf("The original matrix is:\n");

    for(int i=0;i<b;i++){
        for(int j=0;j<b;j++){
            c++;
            a[i][j]=c;
            printf("%3d",c);
        }
        printf("\n");
    }
    printf("The changed matrix is:\n");
    for(int i=0;i<b;i++){
        for(int j=0;j<b;j++){
            printf("%3d",a[j][i]);
        }
        printf("\n");
    }



}

3程序改错(4分)

题目内容:

下面程序的功能是从键盘任意输入n个数,然后找出其中的最大数与最小数,并将其位置对换。目前程序中存在错误,请修改正确。并按照给出的程序运行结果示例检查修改后的程序。

程序运行结果示例1:

Input n(n<=10):

5↙

Input 5 Numbers:

12 4 6 7 0↙

After MaxMinExchange:

0 4 6 7 12

程序运行结果示例2:

Input n(n<=10):

6↙

Input 6 Numbers:

7 -3 2 0 56 18↙

After MaxMinExchange:

7 56 2 0 -3 18

    #include  
  #define ARR_SIZE 10
  int main()
  {
     int a[ARR_SIZE], i, n;
     printf("Input n(n<=10):\n");
     scanf("%d", &n);
     printf("Input %d Numbers:\n", n);
     for (i=0; i<n; i++)
     {
        scanf("%d", &a[i]);
     }
     MaxMinExchang(a, n);
    printf("After MaxMinExchange:\n");
     for (i=0; i<n; i++)
     {
        printf("%d ", a[i]);
     }
    printf("\n");
    return 0;
  }
  void  MaxMinExchang(int *a, int n)
 {
     int  maxValue = a[0], minValue = a[0], maxPos, minPos;
     int  i, temp;
     for (i=0; i<n; i++)
    {
       if (a[i] > maxValue)
        {
           maxValue = a[i];
           maxPos = i;
        }
        if (a[i] < minValue)
       {
            minValue = a[i];
            minPos = i;
        }
     } 
     temp = a[maxPos];
     a[maxPos] = a[minPos];
     a[minPos] = temp;
  }

输入提示信息: “Input n(n<=10):\n”

“Input %d Numbers:\n”

输入格式: “%d”

输出格式:"%d " (注意:%d后面有一个空格)

输出提示信息:“After MaxMinExchange:\n”

 #include  
#define ARR_SIZE 10
void  MaxMinExchang(int *a, int n);
  int main()
  {
     int a[ARR_SIZE], i, n;
     printf("Input n(n<=10):\n");
     scanf("%d", &n);
     printf("Input %d Numbers:\n", n);
     for (i=0; i<n; i++)
     {
        scanf("%d", &a[i]);
     }
     MaxMinExchang(a, n);
    printf("After MaxMinExchange:\n");
     for (i=0; i<n; i++)
     {
        printf("%d ", a[i]);
     }
    printf("\n");
    return 0;
  }
  void  MaxMinExchang(int a[], int n)
 {
     int  maxValue = a[0], minValue = a[0], maxPos=0, minPos=0;
     int  i, temp;
     for (i=0; i<n; i++)
    {
       if (a[i] > maxValue)
        {
           maxValue = a[i];
           maxPos = i;
        }
        if (a[i] < minValue)
       {
            minValue = a[i];
            minPos = i;
        }
     }
     temp = a[maxPos];
     a[maxPos] = a[minPos];
     a[minPos] = temp;
  }

4蛇形矩阵(4分)

题目内容:

从键盘任意输入一个自然数n(n表示矩阵的大小,假设不超过100),请编程输出一个n*n的蛇形矩阵。如果输入的n不是自然数或者输入了不合法的数字,则输出"Input error!"。

函数原型: void ZigzagMatrix(int a[][N], int n);

函数功能:计算n*n的蛇形矩阵

提示:用两个双重循环分别计算n*n矩阵的左上三角和右下三角,设置一个计数器从1开始记录当前要写入矩阵的元素值,每次写完一个计数器加1,在计算左上角和右下角矩阵元素时,分奇数和偶数两种情况考虑待写入的元素在矩阵中的行列下标位置。

程序运行结果示例1:

Input n:

5↙

1 2 6 7 15

3 5 8 14 16

4 9 13 17 22

10 12 18 21 23

11 19 20 24 25

程序运行结果示例2:

Input n:

4↙

1 2 6 7

3 5 8 13

4 9 12 14

10 11 15 16

程序运行结果示例3:

Input n:

-5↙

Input error!

程序运行结果示例4:

Input n:

105↙

Input error!

程序运行结果示例5:

Input n:

w↙

Input error!

输入提示信息:“Input n:\n”

输入错误提示信息:“Input error!\n”

输入格式: “%d”

输出格式:"%4d"

数据换行: “\n”

#include 
#include 
#define N 100
void ZigzagMatrix(int a[][N], int n);
int main()
{
    int n,a[N][N]={0};
    printf("Input n:\n");
    int b = scanf("%d",&n);
    if(b!=1 || n<0 || n>100){
        printf("Input error!\n");
    }else{
        ZigzagMatrix(a,n);
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                printf("%4d",a[i][j]);
            }
            printf("\n");
        }
    }
    return 0;

}
void ZigzagMatrix(int a[][N], int n){
    int count =1,flag=1;
    for(int i=0;i<2*n-1;i++){
        if(i<n){
            //处理上三角(含斜对角线)
            for(int j=0;j<=i;j++){
                if(flag){ //通过标志处理从下往上赋值
                    a[i-j][j]=count++; //a[0][0] ;a[2][0],a[1][1],a[0][2]
                }else{
                    a[j][i-j]=count++; //a[0][1],a[1][0]
                }
            }
        }else{
            for(int j=i-n+1;j<n;j++){
                if(flag){
                    a[i-j][j]=count++;
                }else{
                    a[j][i-j]=count++;
                }
            }
        }
        flag = (flag+1)%2; //控制对角线从上往下走,还是从下往上走
    }
} 

5亲密数_1(4分)

题目内容:

2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系:

220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284

284的真因数之和为:1+2+4+71+142=220

毕达哥拉斯把这样的数对称为相亲数。相亲数,也称为亲密数,如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。

从键盘任意输入两个整数m和n,编程判断m和n是否是亲密数。若是亲密数,则输出“Yes!”,否则输出“No!”

程序运行示例1

Input m, n:

220,284↙

Yes!

程序运行示例2

Input m, n:

224,280↙

No!

输入提示信息:“Input m, n:\n”

输入格式: “%d,%d”

输出格式:

输出提示信息:“Yes!\n”

          "No!\n"
 #include 
#include 
#define N 100

int main()
{
    int a,b,sum=0,sum1=0;
    printf("Input m, n:\n");
    scanf("%d,%d",&a,&b);
    for(int i=1;i<(a>b?a:b);i++){
        if(a%i==0 && a!=i){
            sum+=i;
        }
        if(b%i==0 && b!=i){
            sum1+=i;
        }
    }
    if(sum == b && sum1 == a){
        printf("Yes!\n");
    }else{
        printf("No!\n");
    }

    return 0;

}

6亲密数_2(4分)

题目内容:

2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系:

220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284

284的真因数之和为:1+2+4+71+142=220

毕达哥拉斯把这样的数对称为相亲数。相亲数,也称为亲密数,如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。

从键盘任意输入一个整数n,编程计算并输出n以内的全部亲密数。

程序运行示例1

Input n:

3000↙

(220,284)

(1184,1210)

(2620,2924)

程序运行示例2

Input n:

1000↙

(220,284)

输入提示信息:“Input n:\n”

输入格式: “%d”

输出格式: “(%d,%d)\n”

 #include 
#include 
#define N 100
int LoveNum(int a,int b);
int main()
{
    int n;
    printf("Input n:\n");
    scanf("%d",&n);
    for(int i=1;i<n;i++){
      int sum = 0;
      for(int j=1;j<i;j++){
        if(i%j==0){
            sum+=j;
        }
      }
      if(sum>i){
        if(LoveNum(sum,i)){
             printf("(%d,%d)\n",i,sum);
             i=sum+1;
        }
      }

    }

    return 0;

}
int LoveNum(int a,int b){
    int sum = 0,sum1=0;
    for(int i=1;i<a;i++){
        if(a%i==0){
            sum+=i;
        }
        if(b%i==0 && b!=i){
            sum1+=i;
        }
    }
    if(sum == b && sum1 == a){
        return 1;
    }else{
        return 0;
    }
}

7完全数(4分)

题目内容:

完全数(Perfect Number),又称完美数或完数,它是指这样的一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身,即m的所有小于m的不同因子(包括1)加起来恰好等于m本身。注意:1没有真因子,所以1不是完全数。计算机已经证实在10300以下,没有奇数的完全数。例如,因为6 = 1 + 2 + 3,所以6是一个完全数。

从键盘任意输入一个整数m,编程判断m是否是完全数。若m是完全数,则输出“Yes!”,并同时打印出每一个完美数的全部因子,以验证这个数确实是一个完美数。若m不是完全数,则输出“No!”

程序运行示例1

Input m:

28↙

Yes!

1,2,4,7,14

程序运行示例2

Input m:

6↙

Yes!

1,2,3

程序运行示例3

Input m:

1↙

No!

输入信息提示:“Input m:\n”

输入格式: “%d”

输出格式:

输出格式: “%d”

输出信息提示:“Yes!\n”

“No!\n”

 #include 
#include 

int FullNum(int a);
int main()
{
    int n,b=0;
    printf("Input m:\n");
    scanf("%d",&n);
    b=FullNum(n);
    if(b){
        printf("Yes!\n");
        for(int i=1;i<n;i++){
            if(n%i==0){
                if(i==1)
                    printf("%d",i);
                else
                   printf(",%d",i);
            }
        }
    }else{
        printf("No!\n");
    }

    return 0;

}
int FullNum(int a){
    int sum = 0;
    for(int i=1;i<a;i++){
        if(a%i==0){
            sum+=i;
        }
    }
    if(sum == a){
        return 1;
    }else{
        return 0;
    }
}

8回文素数(4分)

题目内容:

所谓回文素数是指对一个素数n,从左到右和从右到左读是相同的,这样的数就称为回文素数,例如11,101,313等。编程计算并输出不超过n(100<=n<1000)的回文素数,并统计这些回文素数的个数,其中n的值从键盘输入。

程序运行示例1

Input n:

100↙

11

count=1

程序运行示例2

Input n:

1000↙

11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929

count=16

输入提示信息:“Input n:\n”

输入格式:"%d"

输出格式:

回文素数的输出格式:"%4d"

统计回文素数个数的输出格式: “\ncount=%d\n”

 #include 
#include 
#include 
int HuiNum(int a);
int main()
{
    int n,count=1;
    printf("Input n:\n");
    scanf("%d",&n);
    printf("%4d",11);
    for(int i=100;i<=n;i++){
       if(HuiNum(i)){
            count++;
            printf("%4d",i);
       }
    }

    printf("\ncount=%d\n",count);


    return 0;

}
int HuiNum(int a){
    int flag = 1;
    for(int i=2;i<=sqrt(a);i++){
        if(a%i==0){
            flag = 0;
            break;
        }
    }

    if(flag && a%10==a/100){
        return 1;
    }else{
        return 0;
    }
}

9梅森尼数(4分)

题目内容:

形如2i-1的素数,称为梅森尼数。编程计算并输出指数i在[2,n]中的所有梅森尼数,并统计这些梅森尼数的个数,其中n的值由键盘输入,并且n的值不能大于50。其中,2i表示2的i次方,请不要使用pow(2,i)编程计算,应采用循环累乘求积的方式计算2^i。

提示:当i 超过30以后,2^i-1的值会很大,不能用long型变量来存储,必须使用double类型来存储。对于double类型变量x(不是整型)不能执行求余运算,即不能用 x % i == 0来判断x是否能被i整除,可以使用 x / i == (int)(x/i)来判断x是否能被i整除。

程序运行示例:

Input n:

50↙

2^2-1=3

2^3-1=7

2^5-1=31

2^7-1=127

2^13-1=8191

2^17-1=131071

2^19-1=524287

2^31-1=2147483647

2^49-1=562949953421311

count=9

输入提示信息:“Input n:\n”

输入格式: “%d”

输出格式:

梅森尼数的输出格式: “2^%d-1=%.0lf\n”

统计梅森尼数个数的输出格式: “count=%d\n”

 #include 
#include 
#include 
int SuNum(double a);
int main()
{
    int n,count=0;
    double x=1,y;
    printf("Input n:\n");
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        x=x*2;
        y=x-1;
        if(SuNum(y)){
            count++;
            printf("2^%d-1=%.0lf\n",i,y);
        }
    }

    printf("count=%d\n",count);



    return 0;

}
int SuNum(double a){
    if(a<2){
        return 0;
    }
    int flag = 1;
    for(int i=2;i<=sqrt(a);i++){
        if(a/i==(int)(a/i)){
            flag = 0;
            break;
        }
    }
    return flag;


}

10工资统计(4分)

题目内容:某公司有职员(最多50人),试编写程序打印最高工资、最低工资和平均工资。公司人数在主函数给出,职工工资输入请调用Input函数,计算最高工资、最低工资和平均工资调用Compute函数,打印最高工资、最低工资和平均工资在主函数。请在给定的框架下写出完整程序。

#include

void Input(float wage[], int n);

float Compute(float wage[], int n, float *pmaxwage, float *pminwage);

int main()

{

float wage[50],maxwage,minwage,avewage;

int n;



printf("Please input n:\n");

scanf("%d",&n);



Input(  ...  );     

avewage=Compute(  ...  );



printf("maxwage=%.2f, minwage=%.2f, avewage=%.2f\n",maxwage,minwage,avewage);



return 0;

}

void Input(float wage[], int n)

{

 ...

}

float Compute(float wage[], int n, float *pmaxwage, float *pminwage)

{

 ...

}

程序运行结果示例:

Please input n:

10↙

1200.34↙

2378.48↙

8600.56↙

5372.42↙

6317.25↙

7265.88↙

2156.39↙

1876.31↙

1792.14↙

4326.22↙

maxwage=8600.56, minwage=1200.34, avewage=4128.60

输入人数提示信息:“Please input n:\n”

人数输入格式:"%d"

工资输入格式:"%f"

输出格式:“maxwage=%.2f, minwage=%.2f, avewage=%.2f\n”

 #include

void Input(float wage[], int n);

float Compute(float wage[], int n, float *pmaxwage, float *pminwage);

int main()

{

    float wage[50],maxwage,minwage=0,avewage=0;

    int n;



    printf("Please input n:\n");

    scanf("%d",&n);



    Input(wage,n);

    avewage=Compute(wage,n,&maxwage,&minwage);



    printf("maxwage=%.2f, minwage=%.2f, avewage=%.2f\n",maxwage,minwage,avewage);



    return 0;

}



void Input(float wage[], int n)

{
    for(int i=0;i<n;i++)
        scanf("%f",&wage[i]);
}

float Compute(float wage[], int n, float *pmaxwage, float *pminwage)

{
    float sum = 0.0;
    *pmaxwage = wage[0];
    *pminwage = wage[0];

    for(int i=0;i<n;i++){
        sum+=wage[i];
        if(*pmaxwage < wage[i])
            *pmaxwage = wage[i];
        if(*pminwage > wage[i])
            *pminwage = wage[i];
    }

    return sum/n;



}

你可能感兴趣的:(#,C语言程序设计精髓,练兵题)