这个4月第二周的学习结束了这是这个阶段小编的学习经历和写题心得如果有不正确的地方还请大家帮我指正哦点击标题蓝色字体链接即可跳转做题哦牛客网ISBN号码这里一定要注意逻辑问题我刚开始弄错了判定的方式我刚开始由ret10直接就得出Right导致错误。正确的逻辑是在计算完取余操作以后如果取余结果等于10则识别码为X否则的话识别码就会等于将得到的余数通过0转化成的结果。判定是否是正确的ISBN码是要看输入的ISBN号码的识别码是否正确。假如输入的ISBN号码的识别码正确那么输出“Right”否则按照规定的格式输出正确的ISBN号码。即把正确的识别码给到原来字符串的最后一位替换掉然后把正确的那一串ISBN码给输出来就可以了。#includeiostreamusing namespace std;intmain(){chararr[13];for(inti0;i13;i){cinarr[i];}intsum0;//ASCII编码不等于数字arr[i]对应的字符的值是指ASCII编码//先将字符转化成数字sum(arr[0]-0)*1(arr[2]-0)*2(arr[3]-0)*3(arr[4]-0)*4(arr[6]-0)*5(arr[7]-0)*6(arr[8]-0)*7(arr[9]-0)*8(arr[10]-0)*9;intretsum%11;charcor;//如果取余结果等于10识别码就是Xif((ret)10){corX;}//否则识别码是取余后的结果转化成的字符else{cor0ret;}//替换掉末尾的识别码charinparr[12];if(corinp){coutRightendl;}else{arr[12]cor;for(inti0;i13;i){coutarr[i];}}return0;}牛客网水仙花数#includeiostream#includecmathusing namespace std;boolShuiXianHua(intn){intgn%10;intsn/10%10;intbn/100%10;return(g*g*gs*s*sb*b*bn);}intmain(){intm0;intn0;while(cinmn){bool f1;bool has0;for(intim;in;i){if(ShuiXianHua(i)){has1;if(f){couti;f0;}elsecout i;}}if(has)coutendl;elsecoutnoendl;}return0;}这题我在输出方式上卡了好久最重要的是控制输出的形式有考虑过标志位但是使用以后发现好像不对劲后面才在提示下想到用两个标志位来解决。刚开始从输入的范围开始判断是否是水仙花数因为如果接下来有很多个水仙花数那么输出的时候要留空格如果一个都没有那就直接输出no。考虑到题目有多组输入并且如果输入的范围里面有多个输出的时候第一个是直接输出就可以的但是后序输出的需要控制输出空格。所以当判断第一个数得到水仙花数以后就把标志位置has有水仙花数为1接着再去判断这个是第几个水仙花数如果是第一个那就直接输出i就可以了接下来把标志位置f 给重置为0这样后序输出的水仙花数就走else去先输出一个空格再输出i 所以从这里可以看出初始化的时候判断是否为第一个水仙花数的标志位需要初始化为1因为它是在进入判断判断为是水仙花数以后生效这个时候对于第一个水仙花数就要把它输出。最后对于每轮输入的范围我们已经完成了在判断到数字为水仙花数的时候将其逐个输出所以接下来在每轮输出完以后只需要再控制输出换行和该输入范围内没有水仙花数时的格式输出即可。牛客网公务员面试这一道题自己卡在了多组输入如何实现这个步骤上。刚开始我有想过使用cin.get ()但是一查发现它好像是用来获取字符的后面查阅才得到提示可以直接从控制输入首个数据来达到控制多组输入数据的效果但是这样的话就要注意while循环里在读取到第一个数据以后通过for循环继续往数组里面塞数据就得从第二个数据开始塞因为一开始已经通过cinarr[0]获取到了第一个数据。所以从i1第二个数据开始。当然针对于题目中要求的剔除最高分和最低分我在刚开始的时候还写了两句代码就是让arr[0]和arr[6]都等于0.这么做的话其实是存在一定的缺陷的就是说如果我单纯的将它们两个置为0后续计算平均成绩的时候如果不小心包含了它们就会把0算进去也就是不小心按7个算所以实际上我后面的for循环已经控制了从第2个到第6个去累加求和就没有必要进行这一步的将首尾置为0的步骤了牛客网小乐乐与进制转换法1// #include iostream// using namespace std;// int main()// {// int n0;// cinn;// long long ret0;// int w1;// while(n0)// {// int ln%6;// retretl*w;// w*10;// n/6;// }// coutretendl;// return 0;// }法2#includeiostreamusing namespace std;intmain(){intn0;cinn;intret[20]{0};intl0;while(n0){ret[l]n%6;n/6;}for(intil-1;i0;i--){coutret[i];}return0;}刚开始想直接用循环来得到结果但是好像会存在溢出现象所以改为使用数组来存储每次取余得到的数字最后倒序输出就是结果牛客网金币#includeiostreamusing namespace std;intmain(){intk0;cink;inttotal0;intcurStage1;while(k0){if(kcurStage){totaltotalcurStage*curStage;kk-curStage;}else{totaltotalk*curStage;k0;}curStage;}couttotalendl;return0;}这道题目刚开始的时候感觉有点绕绕的一下子把自己绕进去了。后面发现首先要明白这一点发金币是按不同阶段来发的每个阶段发的金币都不一样其次这道题的关键就在于要弄清楚三个关系当前阶段数当前阶段的天数当前阶段每一天发的金币数量所以令当前阶段初始化为1输入的天数是正整数用while循环来控制分两种情况天数当前阶段数这期间的金币数量当前阶段数*当前阶段每一天发的金币数量注意这两个值是相等的之前已经发了的total随着当前阶段数的增加剩余的天数要相应地减少这里特别注意就是天数 - 阶段数的时候阶段数不是只有一天所以就会产生第2种情况剩余的天数不够了剩余天数不够意思比如 k 剩下一天当前是第 4 阶段那么接下来就只要发这一天的就可以了我们还可以根据给的测试用例来分析k 6, 当前阶段1当前阶段2k6-15剩余5天当前阶段3,k3剩余3天当前阶段4,k0结束所以这种情况下这个阶段里只需要把当前剩余天数里的金币发完就可以了totaltotalk*curStage;最后别忘记将剩余天数k置为0然后阶段数增加牛客网计数问题这一题刚开始自己在写的时候忽略了一点就是我原来直接用 i 进行取余运算逐个判断是否等于 x 这样的话后面得到的 i 就不是按照原来1-n的顺序递增的。在我发现这个错误以后还犯了一个错误就是把 j 缩小的代码放进了 if 当中这样会导致只有当j%10x才会执行j/10如果当前位上的数字不等于x那就使 j 永远不变。牛客网矩阵转置//法1直接交换行列intmain(){intn0;intm0;scanf(%d %d,n,m);intarr[n][m];//输入for(inti0;in;i){for(intj0;jm;j){scanf(%d,arr[i][j]);}}//交换行列输出for(inti0;im;i){for(intj0;jn;j){printf(%d ,arr[j][i]);}printf(\n);}return0;}在我们把数据塞完以后直接交换行和列输出即可//法2创建第2数组实现交换intmain(){intn0;intm0;scanf(%d %d,n,m);intarr[n][m];//输入for(inti0;in;i){for(intj0;jm;j){scanf(%d,arr[i][j]);}}//交换intbrr[m][n];for(inti0;in;i){for(intj0;jm;j){brr[j][i]arr[i][j];}}//输出for(inti0;im;i){for(intj0;jn;j){printf(%d ,brr[i][j]);}printf(\n);}return0;}这里是通过创建第二数组来实现交换那我们就要注意第二数组的行和列与原来数组的行和列是相反的即brr[m][n]交换的时候i和j控制的行列和原来是一样的只需要在第二数组翻转即可输出的时候直接按第二数组行列输出好啦小编今天的分享就到这里