程序设计入门——C语言(翁凯老师)(数组,字符串,指针)

时间:2021-07-19 20:03:02
  • 高精度小数(10分)(mooc第六周编程练习)

题目内容:

由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法。

(0,1)之间的任何浮点数都可以表达为两个正整数的商,为了表达这样两个数的商,可以将相除的结果以多个整数来表示,每个整数表示结果的一位。即商的第一位用一个整数来表示,第二位用另一个整数来表示,以此类推,就可以输出一个高精度的除法结果了。

如16/19的结果0.8421052631...就可以依次输出8、4、2、1、0、5、2、6、3、1...。

而除法的过程,则可以模仿人工列竖式做除法的方式,先将被除数乘以10,得到一位商以后,将余数乘以10作为下一轮计算的被除数:

    160/19->8余8

    80/19->4余4

    ...

当某次余数为0时,则表明除尽。

现在,请写一个程序,输入一个分数,计算出它的小数形式。无论是否可以除尽,输出最多小数点后200位。

 输入格式:

形如

    a/b

的两个数,其中10<=a<b<100。也就是说,这个小数一定是小于1的正数。

提示:输入是带着两个数中间的“/”的,所以scanf应采用“%d/%d”这样的输入格式。

 输出格式:

形如

    0.xxxxxxxxx

的小数,小数点后最多200位。输出结束的时候要带着回车换行。如果a/b是一个有限不循环小数,则输出完所有的有效位就可以了,不需要再输出后面的0来凑满200位。

 输入样例:

16/19

 输出样例:

0.84210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684

 时间限制:500ms内存限制:32000kb

// 高精度小数

#include<stdio.h>

int main(){
    const int maxsize = 200;
    int M, N, count=0, reminder;
    scanf("%d/%d", &M, &N);
    int a[maxsize];
// 输入的两个整数M,N 其中 M<N, 下面for循环的作用是计算200位小数点以内的M/N的结果
    for (int i=0;i<200;i++){
        a[i] = M * 10 / N;
        reminder = M * 10 % N;
        M = reminder;
        count ++;
        if (reminder == 0) break;
    }
    printf("0.");
// 如果结果是有限循环小数,就不用输出到200位
    for (int j=0;j<count;j++) printf("%d", a[j]);
    return 0;
}
  •  多项式加法(5分)(第七周编程作业)

题目内容:

一个多项式可以表达为x的各次幂与系数乘积的和,比如:

2x6+3x5+12x3+6x+20

现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。

程序要处理的幂最大为100。

 输入格式:

总共要输入两个多项式,每个多项式的输入格式如下:

每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。

注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。

 输出格式:

从最高幂开始依次降到0幂,如:

2x6+3x5+12x3-6x+20

注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。

 输入样例:

6 2

5 3

3 12

1 6

0 20

6 2

5 3

2 12

1 6

0 20

 输出样例:

4x6+6x5+12x3+12x2+12x+40

时间限制:500ms内存限制:32000kb
// 多项式加法

#include<stdio.h>
int main(){
    int a[101] = {0};
    int M, N, max=0, flag=0, temp=0;
    scanf("%d %d", &M, &N);
// 读取各幂次的多项式,并合并同类项
    while(1){
        a[M] += N;
        if (M == 0) flag++;
        if (flag == 2) break;
        scanf("%d %d", &M, &N);
    }
// 读取最高幂次项
    for (int i=100;i>=0;i--){
        if(a[i]!=0) {
            max = i;
            break;
        }
    }
// 分情况输出多项式
    for (int i=max;i>=0;i--){
// 当多项式幂次位1时
        if (i==0) {
            if (a[0]<0)printf("%d", a[0]);
            else if (i == max) printf("%d", a[0]);
            else printf("+%d", a[0]);
        }
// 当多项式系数为1时
        else if (a[i] == 1) {
            if (i==1 && max != 1) printf("+x");
            else if (i == max) printf("x%d", max);
            else printf("+x%d", i);
            }
// 当多项式系数为-1时
        else if (a[i] == -1){
            if (i==1) printf("-x");
            else printf("-x%d", i);            
        }
// 当多项式系数大于1时
        else if (a[i] > 1){
            if (i==1 && max != 1) printf("+%dx", a[1]);
            else if (i==max) printf("%dx%d", a[i], i);
            else printf("+%dx%d", a[i], i);
        }
// 当多项式系数小于-1时
        else if (a[i] < -1){
            if (i==1) printf("%dx", a[1]);
            else printf("%dx%d", a[i], i);
        }
    }
    return 0;
}
    
  •  鞍点(5分)(mooc第七周编程练习)

题目内容:

给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。

你的任务是找出A的鞍点。

 输入格式:

输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格。

输出格式:

对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。

如果找不到,就输出

NO

题目所给的数据保证了不会出现多个鞍点。

 输入样例:

1 7 4 1 

4 8 3 6 

1 6 1 2 

0 7 8 9

 输出样例:

2 1

 

时间限制:500ms内存限制:32000kb
// 鞍点

#include<stdio.h>
int main(){
    int N, flag = 1;
    scanf("%d", &N);
    int a[N][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 max = 0, max_j=0, min_i=i;
        max = a[i][0];
// 读取一行最大的数字max,并记录该数字的位置
        for (int j=1;j<N;j++){
            if (max<a[i][j]) {
                max = a[i][j];
                max_j = j;
            }
        }
        int k=0;
// 判断数字max是否是该列最小的数字,如果是立即退出循环,flag置0
        for (;k<N;k++){
            if (a[min_i][max_j]>a[k][max_j]) break;
        }
        if (k == N) {
            flag = 0;
            printf("%d %d", min_i, max_j);
            break;
        }
    }
// 如果存在鞍点,flag为0,不存在flag为1,且输出NO
    if (flag) printf("NO");
    return 0;
}

 

  • 单词长度(4分)(mooc第八周编程练习)

题目内容:

你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格。

 输入格式:

输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。

 输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

 输入样例:

It's great to see you here.

 输出样例:

4 5 2 3 3 4

时间限制:500ms内存限制:32000kb
// 单词长度

#include<stdio.h>
int main(){
    char word;
    int i=0;
    while(1){
        scanf("%c", &word);
// 分三种情况讨论,当遇到'.'时,如果前面有单词,输出单词位数,没有则直接跳出循环
        if (word == '.'){
            if (i!=0) printf("%d", i);
            break;
        }
// 当遇到' '时,如果前面有单词,输出单词位数,且单词计数置零
        else if(word == ' '){
            if (i!=0) printf("%d ", i);
            i = 0;
        }
// 遇到单词时,直接计数++
        else i++;
    }
    return 0;
}