前言:
博文结构:开头是本文涉及的题目;
牛客网链接;题目截图;【不太懂的会加百度词条】;
解题思路;代码通过截图;代码实现;该题收获总结;
以上就是本刷题专栏的结构---旨在尽快提升编程能力设置的例行格式!
今日份题目有:小乐乐改数字、KiKi算期末成绩、(a+b-c)*d、牛牛的线段、kiki算数、及格分数、判断整数奇偶性、打印X图案、打印带空格直角三角形图案。
较有难度的是:打印X图案、打印带空格直角三角形图案、小乐乐改数字、牛牛的线段。博主先讲这些。
一.刷题(1)
1.1打印X图案
牛客网链接:OJ链接
解题思路:我们输入的数字是行数,很明显这个X图案是由*和空格组合打印出来的,空格如果算上,这是一个n行n列的二维数组。正反对角线打印*,其余打印空格。
#include <stdio.h> int main() { int n = 0; //多组输入 while(~scanf("%d", &n)) { int i = 0; //打印n行 for(i = 0; i < n; i++) { int j = 0; //打印第i行里的n列 for(j = 0; j < n; j++) { //i和j相等是正对角线 //i+j等于n-1是反对角线 if(i == j || i + j == n - 1) { printf("*"); } else { printf(" "); } } //打印完一列换行 printf("\n"); } } return 0; }
收获总结:正对角线是行和列相等的情况,反对角线是行和列之和等于行数减1; 多组输入的另一中表示方法~scanf("%d", &n);
补充:当scanf读取失败时会返回EOF,EOF的值是-1,如果对-1按位取反(~),由于-1的补码为全1,全部取反就会变成全0,结果就为0(假)。
1.2打印带空格直角三角形图案
牛客网链接:OJ链接
解题思路:这道题要求我们输入确定打印的行数,观察一下,这个图形由空格和*组成的,先打印空格,再打印*,并且如果看成是5行5列的二维数组。打印单元空格需要两个,打印单元*要加空格。
#include <stdio.h> int main() { int n = 0; //多组输入 while(scanf("%d", &n) != EOF) { int i = 0; //打印n行 for(i = 0; i < n; i++) { int j = 0; //打印第i行里的n列 //1.先打印空格单元 for(j = 0; j < n - 1 - i; j++) { //两个空格 printf(" "); } //2.打印*加空格 for(j = 0; j <= i; j++) { printf("* "); } //打印完一列换行 printf("\n"); } } return 0; }
收获总结:在打印这种一列(横向看)由两种单元组成的时候,控制循环是关键。观察分析在打印第一行的时候,有4个单元,第二行有3个单元空格,一直到0。在打印第一列的时候需要循环4次,用n的话是打印5次,用n-1的话一直是打印4次,再减去随行数增加的行数i,推断一下,i为0的时候,j<n-1-i,单元空格打印4次,i为1时,j<n-1-i,单元空格打印3次,符合就这么做。在控制*空格的时候,打印一次,两次,直到n次,j<=i可以在i等于0的时候打印1次,i为1的时候打印两次,符合。也可以这样j<i+1。
1.3小乐乐改数字
牛客网链接:OJ链接
解题思路:这道题的意思是说,输入一个整数,把这个整数里的每一位换成0或1,对应的规则是,如果该位是奇数,改成1,偶数改成0。我们给出一个存放32个整型的数组,然后把这个整数的每一位取出来放在数组里,最后再把每一位根据它是第几位,乘上相应的权重后,全部加起来就是我们要求的更换后的数字,最后打印出来。
#include <stdio.h> #include <math.h> int main() { int n = 0; scanf("%d", &n); int arr[32] = {0}; int i = 0; //从低取出n的每一位放到数组里 while(n) { //偶数放0 if(n % 2 == 0) { arr[i++] = 0; } //奇数放1 else { arr[i++] = 1; } //丢弃掉最低的一位 n /= 10; } //由于我们都是放完后,数组的下一位等待放 //最后一次n已经被改成0,所以让i--变成数组的末下标 for(i--;i>=0;i--) { //最后变成的数字是10进制 n += arr[i] * pow(10, i); } printf("%d\n", n); return 0; }
收获总结:循环取模,除法,对数组的每一位进行分离拆解;提高在循环中对下标的控制能力;拓宽思维。
1.4牛牛的线段
牛客网链接:OJ链接
解题思路:不要看错题目的输入,睁大眼睛看!
#include <stdio.h> #include <math.h> int main() { int x1, y1; int x2, y2; //题目说分两组输入 scanf("%d %d", &x1, &y1); scanf("%d %d", &x2, &y2); //由于我们没有绝对值,所以要保证是大的数减小的数 int n = x1>x2?x1-x2:x2-x1; int m = y1>y2?y1-y2:y2-y1;\ //使用一个新的变量接收它们的和,不能直接放在printf里链式访问 int end = pow(n, 2)+pow(m, 2); printf("%d\n", end); return 0; }
收获总结:第一就是要看清题目,博主第一次在尝试解的时候,对应的输入弄混了,拷到VS里调试一番才知道哪里出问题了;printf("%d\n", pow(n, 2)+pow(m, 2));这个代码它跑不过去,初步判断是因为这是两个函数,它不是像我们想的那样,求出它们的和之后再以整型的方式打印出来,它这样写是错误的;最后就是锻炼代码能力。
OK,较难一点的讲完后,把简单的顺便一提吧~都是刷题的见证。