2019-01-25 认清现实

只能刷简单的水题了

    昨天下午解决了一个可以用字符强制转换来方便解决的问题后,晚上想继续写,可是发现1003用到了指针的知识,搞了半天最后不想搞了。晚上想了想,可能现在我的垃圾能力还不足以去写,还是优先解决一些基础入门的问题。于是在MOOC上看了翁凯的C语言入门,在PTA上找到了对应的一些题目,先汇报一下一上午的情况,一上午AC了四道题,其中没有一个是可以自己可以独立完成的,都是会存在一些小问题,最后参考别人的代码找到了自己的错误。不可谓不痛心,同时也备受打击。不过相较于昨天,明显还是有很多地方有进步的,比如整体代码的架构逐渐清晰起来,出现的问题也不是自己无论如何也想不到的了。那么先来总结一下这几题中出现的问题。

6-1    素数

    本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数m≤n。我需要完成的只有这两个函数的功能。一个是判断是否为素数的函数,一个是将传入其中的区间内所有的素数相加的函数。素数的判定较为简单(虽然我也是在网上查的,不过掌握了就是自己的,哈哈哈,复制忍者),即做一个循环来判断该数是否只有自身和1为因数,具体方法就是使用for循环进行多次除余的判断,但是要注意的是,素数是指从2开始的正整数,一开始卡住的地方也就是没有加入n<2的判断。代码可以贴,但没必要。

6-2 哥德巴赫猜想

其实和第一题没有区别,本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。这里出现的问题就是自己有一个错误的想法,就是,想通过偶数的奇偶性来减少循环 判断的次数,但是忘记了素数并不是对称排列的。

#include

#include

int prime( int p );

void Goldbach( int n );

int main()

{

    int m, n, i, cnt;

    scanf("%d %d", &m, &n);

    if ( prime(m) != 0 ) printf("%d is a prime number\n", m);

    if ( m < 6 ) m = 6;

    if ( m%2 ) m++;

    cnt = 0;

    for( i=m; i<=n; i+=2 ) {

        Goldbach(i);

        cnt++;

        if ( cnt%5 ) printf(", ");

        else printf("\n");

    }

    return 0;

}

int prime( int p){

    int temp = 1;

    if( p<2 ){

        temp = 0;

    }

    else{

        for(int i = 2; i < p; i++){

            if( p%i == 0){

                temp = 0;

            }

        }

    }

    return temp;

}

void Goldbach( int n ){//对传入的偶数进行奇素数之和表示,其中必须是一个最大一个最小

    for(int j = 2; j < n ; j++){//不能通过n/2来缩短查找时间,因为素数并不具有对称性

        if(prime(j) != 0 && j % 2 != 0){

            if(prime(n - j) != 0 && (n - j) % 2 != 0){

                printf("%d=%d+%d", n, j, n-j);

                break;

            }

        }

    }

}


6-3 & 6-4 字符串相关问题

这里的后两题其实是一种类型,所以放在一起说(话说前面的也可以ZZZ)6-3是回文问题,6-4是子串查找问题,这里还是通过数组的方法来进行解决的,掌握好循环条件和判定条件考虑到一些特殊情况其实没啥。不过在这里可以引申一个小问题,就是sizeof和strlen这两个函数(或者操作符?)的区别。

经典C语言面试题8:sizeof与strlen的区别 - M_joy666的博客 - CSDN博客

C语言中的strlen与sizeof的区别 - Yelbosh的专栏 - CSDN博客

简单的理解就是sizeof操作符返回的是数据类型的内存占用;而strlen函数返回的是字符串实际长度(到第一个'\0'止)。而我之前要用到的多数都是后者。

回文判断:

bool palindrome( char *s){

    int temp = 1;

    int length = strlen(s);//这里可以扩充到sizeof和strlen的区别

    for(int i = 0; i < length / 2 ; i++){

         if(s[i] != s[length - 1 - i]){

             temp = 0;

         }

   }

    if(temp != 0){

        return true;

    }

    else{

        return false;

    }

}

子串查找:

#include

char *search(char *s, char *t){

    char *p=NULL;

    int i,j,k=0,lens,lent;


    lens = strlen(s);

    lent = strlen(t);

    for(i=0;i

        j=i;

        while(s[j]==t[k]){

            k++;

            j++;

        }

        if(k>=lent){  // k>=lent 才能满足  长度超过题面MAXS, t在结尾处  这个条件

            p=&s[i];

            return p;

        }

        k=0;

    }

    return p;

}

题目链接:PTA | 程序设计类实验辅助教学平台(马上就要关闭了)

话说这个也太丑了,一点都不好看。

下午又刷了一些更水的题,总算也是认清自己的水平也就是刚刚入门,所以就不想别的,安心慢慢刷吧。下午最主要的收获就是遇到了一个会重复输出input字符数组的问题,查询之后以为是缓冲没有及时清理,所以说用C++多好,直接就输出清除缓存一条龙服务,最后的解决办法是将输出的数组的最后一个元素手动地设置为'\0',再正常输出即可。刷题多少还是有点用的。要坚持。

记录一些有价值的题目:

无运算符优先级计算器的实现:(主要还是switch等联结分支语句的使用)

#include

#include

int main()

{

    char input = '0';

    int number = 0, temp = 0, result = 0;

    scanf("%d", &result);

    while(input != '='){

        scanf("%c", &input);

        if(input == '='){

            break;

        }

        else{

            scanf("%d", &number);

            switch(input){

                case '+': result += number; break;

                case '-': result -= number; break;

                case '*': result *= number; break;

                case '/': if(number != 0){result /= number; break;}

                            else{temp = 1; break;}

                default: temp = 1; break;

            }

        }   

    }

    if(temp != 0){

        printf("ERROR");

    }

    else{

        printf("%d", result);

    }

    return 0;

}

 还有的收获就是四舍五入的输出

printf("%.0f", x);//保留到整数,可以以此类推

你可能感兴趣的:(2019-01-25 认清现实)