1 / 22

数组和函数题目讲解

数组和函数题目讲解. 数组7.1 无聊的菇菇一族. 题目要求:输入一个字符串,要求逆序输出该字符串 输入:abcd 输出: dcba 解题思路: 一个字符串abcd比如存在char s[101]里,那么子啊数组的位置信息为s[0]='a',s[1]='b',s[2]='c',s[3]='d'。 那么只要把字符串按下标从3到0 的方式输出就是dcba了。 主要代码: int l=strlen(s); for(i=l-1;i&gt;=0;i--) printf(&quot;%c&quot;,s[i]); printf(&quot;<br>&quot;);.

willa
Télécharger la présentation

数组和函数题目讲解

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数组和函数题目讲解

  2. 数组7.1 无聊的菇菇一族 • 题目要求:输入一个字符串,要求逆序输出该字符串 • 输入:abcd 输出: dcba • 解题思路: • 一个字符串abcd比如存在char s[101]里,那么子啊数组的位置信息为s[0]='a',s[1]='b',s[2]='c',s[3]='d'。 那么只要把字符串按下标从3到0 的方式输出就是dcba了。 主要代码: int l=strlen(s); for(i=l-1;i>=0;i--) printf("%c",s[i]); printf("\n");

  3. 数组7.2田地之争 • 题目要求:统计每个区域a接受任务的总数 • 解题思路:由于区域的编号小于100,就可以开个105的数组,在下标为a的位置存放接收任务的总数,首先初始化每个位置的值为0,s[105]={0}; • 输入a,b后执行s[a]+=b;最后输出即可,s[i]为0的就不用输出了。

  4. 数组7.3 该死的数学课 • 题目要求:总共N个从2开始的连续偶数,每M个连续的数输出平均值,末尾不足M个按实际个数计算输出 • 解题思路: • 1.可以先算刚好M个数的平均值然后再算剩下的。 • 2.m个数先相加再求平均值 • 3.求和可以循环相加,也可以用求和公式:sum=m*(a1+am)/2;am=a1+2*(m-1);

  5. 数组7.4 菇菇叛徒 • 题目要求:找出 N*M 的矩阵中值为1的位置 • 解题思路:由于要统计ans值,所以可以在输入的时候把矩阵中的数相加,所得到的就是ans值,因为矩阵中的数除了1就是0,并用二维数组存放矩阵 • 然后遍历整个矩阵,如果为1就输出i,j值,如果是事先找出来并保存在数组中的要注意数组的大小,即可能矩阵中每一个数都为1,最大就会有10000个(n=100,m=100,100*100) • for(i=0;i< n;i++) • { • for(j=0;j<m;j++) • if(s[i][j]) • pintf("%d %d\n",i,j); • }

  6. 数组7.5 令人发指的清明SAMA • 题目要求:找出一行或一列全为1,行优先,且序号小的优先 • 解题思路:二维数组s[105][105]存放矩阵(不一定是方阵),可以先按行遍历,看是否有一行刚好有M个1有就输出行号,并结束,否则就遍历列是否有N个1 • 如行: • for(i=0;i<N;i++) • {int num=0; • for(j=0;j<M;j++) • num+=s[i][j]; • if(num==M) • {printf("%d",i);break;} • }

  7. 数组7.6 麻麻的难题 • 题目要求:找出矩阵中最小的数,并统计有多少个然后输出位置 • 解题思路:先找出最小的数,然后遍历,找出共有多少个数与最小值相等,并记录位置,最后输出即可

  8. 数组7.7 残忍的麻麻 • 题目要求:找出矩阵中最小的数,并统计有多少个然后输出位置 • 解题思路:和前一题很像,只是先算出每个菇菇的最终值, • 然后找出最小值,并统计个数,记录有哪些,最后输出即可

  9. 数组7.8 麻麻的起司猫 • 题目要求:第i次喂食找出DM 值最低的起司猫 并喂给ai 块节操 • 解题思路:数组存放每只起司猫的DM值 • 循环m次每次找出DM值最小的起司猫位置,并将原来的DM值加上ai后替换原来的DM值 • while(m--) • { • scanf("%d",&temp); • k=mindb(db,n); • db[k]+=temp; • }

  10. 数组7.9 丧心病狂的清明SAMA • 题目要求:执行M次操作,每次把位置为a的字符后交换位置b次(如果已交换到最后则与与第一位交换)。 • 解题思路: • 循环M次,每次循环b次往后交换位置的操作,如字符串存放在st[105]中,l为字符串长度 • 每一次的替换: • for(i=0;i<b;i++) • { • char t=st[(a-1+i)%l]; • st[(a-1+i)%l]=st[(a+i)%l]; • st[(a+i)%l]=t; • }

  11. 字符串输入 • char a[15]; • 如果是一下子输入输出字符串的请用 • scanf("%s",a);printf("%s",a); • ×scanf("%d",&a);×scanf("%d",&a[i]); • 或者一个个输出 • for(i=0;i<l;i++) • printf("%c",a[i]);

  12. 数组7.10 菇菇一族的宝藏 • 题目要求:每向前一格需要耗费的 DB 值为之后一格的 DB 值减前一格的 DB 值,求最开始的DB最少为多少使得最后的DB不小于0 • 解题思路:1 2 3 • 4 5 6,其实可以总结出最后答案是最后一个位置的db值前去其实位置的db值。2-1=1,3-2=1,所以位置1到位置3总共是要减2,即减(2-1+3-2)=3-1;继续往后走也是,所以最后总的要减(2-1+3-2+6-3+5-6+4-5)= • 4-1=3,所以初始值减3要至少为0,所以初始值至少为3

  13. 所以现在剩下找最好停下来的位置的问题 • 如果是偶数行会停在矩阵中间2行的下一行,奇数行就停在中间一行,即停在N/2+1行, • 如果是偶数行会停第N/2列,奇数行就停在M-N/2列

  14. 函数8.1expand • 题目要求:将给定的字符串扩写N次 • 解题思路: • 写一个函数void Expand(char st[],int n)实现将st重复输出n次的功能即可,中间用空格隔开

  15. 函数8.2calculator • 题目要求:根据输入的操作符和操作数进行运算并输出结果 • 解题思路:每一个操作对应一个函数int plus(int x,int y) • int minus(int x,int y),int multi(int x,int y), • int div(int x,int y),输入时根据不同的操作码对应使用不同的函数如 : • switch (id) • { • case 1:x=plus(x,y); break; • .......... • }

  16. 函数8.3找最大和找最小 • 题目要求:当行数为偶数时要找该行 M 个数中最小数,行数为奇数时要找该行 M 个数中最大数, • 解题思路:写2个函数,int findmax(int a[],int n),int findmin(int a[],int n)分别实现找最大值和最小值的功能, • 最后根据行号分别应用对应的函数 • k为行号 • if (k%2) printf("%d\n",findmax(a,m)); • else printf("%d\n",findmin(a,m));

  17. 函数8.4 条形码 • 题目要求:判断输入的条形码的识别码是否正确 • 解题思路:先用字符串保存条形码,并取出里面的数字并计算:分别乘以 1,2,...,9,再求和,然后对11取模,看该数是否和识别码相同,若是10就看该识别码是否是'X',判断正确的话就输出Right,否则输出Wrong。 • 可以直接求该值 last=((st[0]-'0')*1+(st[2]-'0')*2+(st[3]-'0')*3+(st[4]-'0')*4+(st[6]-'0') *5+(st[7]-'0')*6+(st[8]-'0')*7+(st[9]-'0')*8+(st[10]-'0')*9)%11;

  18. 函数8.5最小公倍数 • 题目要求:输出N 个整数的最小公倍数 • 解题思路:2个数a,b的最小公倍数=a*b/gcd(a,b),gcd(a,b)是求2个数的最大公约数。 • 因此先写出最大公约数的函数(辗转相处法) • 再2个,2个地算最小公倍数。即前2个得到的最小公倍数再和第3个数求最小公倍数直到和最后一个求完为止。 • int gcd(int a,int b){ • int r; • r=a%b; • while (r!=0) • { • a=b;b=r;r=a%b;} • return b;}

  19. 函数8.6 奇怪的字符串 • 题目要求:把字符串中当前的位置为素数的输出它的字 • 注意:1不是素数 • 解题思路:写一个判断一个数是否为素数的函数 • int isPrime(int x),再对每个位置判断该位置是否为素数,是就输出该位置的字符。 • 判断i是否是素数就看该数是否有除了1和本身的除数,即能否被2到sqrt(i)的数整除

  20. 函数8.7 幸运单词 • 题目要求:判断 maxn-minn 是否是质数,是则该字符串是 Lucky Word,maxn:字母出现最多的次数,minn则是最少的次数 • 解题思路:因为字符串值包含26个小写的字母,所以可以用int count[26]统计每个字母出现的次数,最后找出出现次数最多和最少的字母次数,再应用判断素数的函数,判断2数只差是否是素数即可

  21. 函数8.8 Ackermann函数 • 题目要求:根据给定的Ackermann 函数是以下的描述: • 和给定的m,n求最后的结果 • 解题思路:该函数是一个递归函数,递归结束的条件是m=0, int A(int m,int n){ • if (m==0) return n+1; • else • if (n==0) return A(m-1,1); • else • return A(m-1,A(m,n-1));}

  22. The end 谢谢 本次课程到此结束

More Related