220 likes | 355 Vues
数组和函数题目讲解. 数组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("<br>");.
E N D
数组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");
数组7.2田地之争 • 题目要求:统计每个区域a接受任务的总数 • 解题思路:由于区域的编号小于100,就可以开个105的数组,在下标为a的位置存放接收任务的总数,首先初始化每个位置的值为0,s[105]={0}; • 输入a,b后执行s[a]+=b;最后输出即可,s[i]为0的就不用输出了。
数组7.3 该死的数学课 • 题目要求:总共N个从2开始的连续偶数,每M个连续的数输出平均值,末尾不足M个按实际个数计算输出 • 解题思路: • 1.可以先算刚好M个数的平均值然后再算剩下的。 • 2.m个数先相加再求平均值 • 3.求和可以循环相加,也可以用求和公式:sum=m*(a1+am)/2;am=a1+2*(m-1);
数组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); • }
数组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.6 麻麻的难题 • 题目要求:找出矩阵中最小的数,并统计有多少个然后输出位置 • 解题思路:先找出最小的数,然后遍历,找出共有多少个数与最小值相等,并记录位置,最后输出即可
数组7.7 残忍的麻麻 • 题目要求:找出矩阵中最小的数,并统计有多少个然后输出位置 • 解题思路:和前一题很像,只是先算出每个菇菇的最终值, • 然后找出最小值,并统计个数,记录有哪些,最后输出即可
数组7.8 麻麻的起司猫 • 题目要求:第i次喂食找出DM 值最低的起司猫 并喂给ai 块节操 • 解题思路:数组存放每只起司猫的DM值 • 循环m次每次找出DM值最小的起司猫位置,并将原来的DM值加上ai后替换原来的DM值 • while(m--) • { • scanf("%d",&temp); • k=mindb(db,n); • db[k]+=temp; • }
数组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; • }
字符串输入 • 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]);
数组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
所以现在剩下找最好停下来的位置的问题 • 如果是偶数行会停在矩阵中间2行的下一行,奇数行就停在中间一行,即停在N/2+1行, • 如果是偶数行会停第N/2列,奇数行就停在M-N/2列
函数8.1expand • 题目要求:将给定的字符串扩写N次 • 解题思路: • 写一个函数void Expand(char st[],int n)实现将st重复输出n次的功能即可,中间用空格隔开
函数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; • .......... • }
函数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));
函数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;
函数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;}
函数8.6 奇怪的字符串 • 题目要求:把字符串中当前的位置为素数的输出它的字 • 注意:1不是素数 • 解题思路:写一个判断一个数是否为素数的函数 • int isPrime(int x),再对每个位置判断该位置是否为素数,是就输出该位置的字符。 • 判断i是否是素数就看该数是否有除了1和本身的除数,即能否被2到sqrt(i)的数整除
函数8.7 幸运单词 • 题目要求:判断 maxn-minn 是否是质数,是则该字符串是 Lucky Word,maxn:字母出现最多的次数,minn则是最少的次数 • 解题思路:因为字符串值包含26个小写的字母,所以可以用int count[26]统计每个字母出现的次数,最后找出出现次数最多和最少的字母次数,再应用判断素数的函数,判断2数只差是否是素数即可
函数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));}
The end 谢谢 本次课程到此结束