## 数组 ### 1 数组的批量增 题目:设计程序,实现把一个数组的所有元素插入到另一个数组的指定索引位置 输入:第一行是第一个数组的元素个数len1,第二行是空格分开的len1 个元素,第三行是第二个 数组的元素个数len2,第四行是空格分开的len2 个元素,第五行是插入索引位置 输出:输出第二个数组插入到第一个数组后,第一个数组的所有元素 ```ini 输入样例: 3 1 2 3 2 4 5 0 输出样例:4 5 1 2 3 ``` ```c #include int main(){ int a[100] = {0}, b[100] = {0}; int len1, len2, index; int i; scanf("%d", &len1); for(i=0;i=index;i--){ a[i+len2] = a[i]; } for(i=0;i int main(){ int a[100]; int len, i, j = 0, num; scanf("%d", &len); for(i=0;i void change(int a[], int n){ int i, j, t, index=0; for(i=1;i a[i]){//i当前遍历的元素下标 如果当前下标值小于中间值则进入 index++;//存储位置后移 t = a[i];//备份当前位置的值 j = i;//将当前位置的下标存储 while(j > index){//如果当前遍历位置下标大于存储位置下标则元素整体后移 a[j] = a[j-1]; j--; } a[index] = t;//元素整体后移后再赋值操作 } } for(i=0;i a[i+1]){ t = a[i]; a[i] = a[i+1]; a[i+1] = t; } } } int main(){ int len, i; int a[100]; scanf("%d", &len); for(i=0;i int main(){ int a[10]; int n; scanf("%d", &n); for(int i=n-1;i>=0;i--){ scanf("%d", &a[i]); } for(int i=0;i int main(){ int n, step, t; scanf("%d", &n); int a[n];//C99及以上C语言标准中可以使用 for(int i=0;i int main(){ int n, max, min, t; scanf("%d", &n); int a[n]; max = min = 0; for(int i=0;i a[i]){ min = i; } } t = a[min]; a[min] = a[0]; a[0] = t; if(max == 0){ max = min; } t = a[max]; a[max] = a[n-1]; a[n-1] = t; for(int i=0;i int main(){ int n, max, min, t; scanf("%d", &n); int a[n]; max = min = 0; for(int i=0;i a[i]){ min = i; } } for(int i=max;i=1;i--){ t = a[i]; a[i] = a[i-1]; a[i-1] = t; } for(int i=0;i int main(){ int a[10]; int n; scanf("%d", &n); for(int i=0;i a[j+1]){ int t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } for(int i=0;i int main(){ int n, max_count=0, max_num, t; scanf("%d", &n); int a[n]; for(int i=0;i max_count){ max_count = t; max_num = a[i]; } } printf("%d %d\n", max_num, max_count+1); return 0; } ``` ### 9 矩阵运算 题目:给定一个𝑛 × 𝑛的方阵,请定义一个函数func,计算该矩阵除副对角线、最后一列和最后一 行以外的所有元素之和,副对角线为从矩阵的右上角至左下角的连线 输入:输入第一行给出正整数n(1 int main(){ int n, s = 0; scanf("%d", &n); int a[n][n]; for(int i=0;i int main(){ int m, n, s; scanf("%d %d", &m, &n); int a[m][n]; for(int i=0;i ### 11 找字符索引 题目:编写程序,从给定字符串中查找某指定的字符所在的索引位置 输入:输入的第一行是单个待查找的字符。第二行是以回车结束的非空字符串(不超过80 个字符) 输出:如果找到,在一行内按照格式“index=下标”,输出该字符在字符串中所对应的下标(下标从0 开始),如果该字符出现多次,则返回最后一次出现的索引位置,否则输出"Not Found" ```ini 输入样例: m programming 输出样例:index=7 ``` ```c #include int main(){ char target, *p; char str[100]; char *index = NULL; p = str; scanf("%c", &target); scanf("%s", str); while(*p != '\0'){ if(*p == target){ index = p; } p++; } if(index != NULL){ printf("index=%d\n", index-str); }else{ printf("Not Found\n"); } return 0; } ``` ### 12 大小写转换 题目:编写程序,对一个以“#”结束的字符串,把小写字母全部转换成大写字母,把大写字母全部 转换成小写字母,并逆序输出结果 输入:一个以“#”结束的字符串,不超过100 个字符 输出:在一行中输出大小写转换后的结果字符串 ```ini 输入样例: Ab!23 cD &*%$ .,# 输出样例: ,. $%*& dC 32!Ba ``` ```c #include int main(){ char ch; char str[100]; char *p = str; while((ch=getchar())!= '#'){ if(ch >= 'a' && ch <= 'z'){ *p = ch-32; }else if(ch >= 'A' && ch <= 'Z'){ *p = ch+32; }else{ *p = ch; } p++; } while(p!= str){ p--; putchar(*p); } printf("\n"); return 0; } ``` ### 13 字符串比较 题目:编写程序,将两个不包含换行符的字符串s1 和s2 比较,若s1>s2,输出1;若s1=s2,输出 0,否则输出-1,要求不要用strcmp 函数 输入:输入总共两行,第一行是第一个字符串,第二行是第二个字符串,字符串的长度均小于100 输出:第一个字符串和第二个字符串比较后的结果 ```ini 输入样例: love love 输出样例:0 ``` ```c #include int main(){ char str1[100], str2[100]; char *p, *q, flag; p = str1; q = str2; gets(str1); gets(str2); while(*p != '\0' && *q != '\0'){ if(*p > *q){ flag = 1; break; }else if(*p < *q){ flag = -1; break; } p++; q++; } if(*p == '\0' && *q == '\0'){ flag = 0; } if(*p != '\0' && *q == '\0'){ flag = 1; } if(*p == '\0' && *q != '\0'){ flag = -1; } printf("%d\n", flag); return 0; } ``` ### 14 字符串排序 题目:编写程序,实现字符串之间的升序排序并输出结果 输入:第一行是一个整数n 代表n 个字符串(n<10 且每个字符串长度都小于80),接下来n 行都 是字符串 输出:递增排序后的结果 ```ini 输入样例: 3 abc b aaaaa 输出样例: aaaaa abc b ``` ```c #include #include int main(){ int n, i, j; scanf("%d", &n); char str[n][80]; char temp[80]; for(i=0;i #include int main(){ char str1[100], str2[100]; int n, i; char *p, *q; scanf("%s %s", str1, str2); scanf("%d", &n); for(i=0;i=str1+n+i-1){ *(p+1) = *p; p--; } } p = str1+n-1; q = str2; while(*q != '\0'){ *p = *q; p++; q++; } printf("%s\n%s", str1, str2); return 0; } ``` ### 16 字符串删除 题目:编写程序,删除字符串中指定的子字符串 输入:输入总共两行,第一行是原字符串,第二行是需要删除的字符串,字符串的长度均小于100 且不包含换行符 输出:删除指定字符串后的新的字符串结果 ```ini 输入样例: abcddeef dee 输出样例:abcdf ``` ```c #include #include int main(){ char str1[100], str2[100]; int n; char *p, *q; scanf("%s", str1); scanf("%s", str2); p = str1; while(*p != '\0'){ q = str2; while(*q == *p && *q != '\0'){ p++; q++; } if(*q == '\0'){ q = p; while(*q != '\0'){ *(q-strlen(str2)) = *q; q++; } *(q-strlen(str2))='\0'; p-=strlen(str2); } if(*q != str2){ p-= q-str2; } p++; } printf("%s\n", str1); return 0; } ``` --- ## 进制转换 ### 1 整数二进制 题目:编写程序,把十进制正整数转换为二进制,其中输入的正整数的二进制长度不会超过 32位 输入:一个正整数 n 输出:正整数的二进制格式 ```ini 输入样例:17 输出样例:10001 ``` ```c #include int main(){ int a[32]; int n, i=0; scanf("%d", &n); while(n){ a[i++] = n%2; n/=2; } i--; while(i>=0){ printf("%d", a[i]); i--; } printf("\n"); return 0; } ``` ### 2 小数二进制 题目:编写程序,把一个浮点数转换为二进制格式,其中整数部分为 0,当小数部分的二进制无穷 尽时,保留 32 位长度即可 输入:一个浮点数,范围为 0.0 int main(){ float n; int b[32], i = 0, j; scanf("%f", &n); while(n && i < 32){ b[i++]=(int)(n*2); n*=2; n-=(int)n; } printf("0."); i--; for(j=0;j<=i;j++){ printf("%d", b[j]); } printf("\n"); return 0; } ``` ### 3 二进制转十进制 题目:输入一个整数的二进制,设计程序,输出该二进制的十进制结果 输入:一 二进制表示的整数,长度不会超过 32 输出:转换成十进制后的结果 ```ini 输入样例:1001 输出样例:9 ``` ```c #include #include int main(){ char str[100]; int b[100]; int i, j = 0, sum=0, t=1; gets(str); for(i=strlen(str)-1;i>=0;i--){ b[j++] = str[i]-48; } for(i=0;i int main(){ char str[100]; char h[100] = {0}; int i, j = 0, sum, t, k, n=4; gets(str); for(i=strlen(str)-1;(i+1)/4 && i > 0;i-=4){ sum = 0; t = 1; for(k=0;k<4;k++){ sum += (str[i-k]-48)*t; t*=2; } if(sum <= 9){ h[j++] = sum+48; }else{ h[j++] = sum-10+65; } } if(i >= 0){ sum = 0; t = 1; while(i >= 0){ sum += (str[i]-48)*t; t*=2; i--; } h[j++] = sum+48; } j--; while(j >= 0){ printf("%c", h[j--]); } printf("\n"); return 0; } ``` ### 5 大整数的加法 题目:设计程序,求两个不超过 200 位的十进制非负整数的和 输入:有两行,每行是一个不超过 200 位的非负整数,不会有多余的前导 0 输出:一行,即相加后的结果。结果里不能有多余的前导 0 ```ini 输入样例: 22222222222222222222 33333333333333333333 输出样例: 55555555555555555555 ``` ```c ``` ### 6.大整数的乘法 题目:设计程序,求两个不超过 200 位的十进制非负整数的乘积 输入:有两行,每行是一个不超过 200 位的非负整数,不会有多余的前导 0 输出:一行,即相加后的结果。结果里不能有多余的前导 0 ```ini 输入样例: 55555 1234567 输出样例: 68586369685 ``` ```c ``` --- ## 文件 ### 1 文件字符统计 题目:给定一个文件“test1.txt“,请统计文件中的英文字母字符和数字字符的个数 输入:给定的一个文件“test1.txt“ 输出:英文字母和数字的个数,用空格隔开 ```ini 输入样例:一个文件,假设内容为:ab\n123\n***\n 输出样例:2 3 ``` ### 2 文件合并 题目:给定两个文件“test1.txt“和”test2.txt“,请把两个文件中的内容合并到一起并写入到新的文 件”test3.txt”之中 输入:两个文件“test1.txt“和”test2.txt“ 输出:合并后的文件“test3.txt“ ```ini 输入样例: 假设 test1.txt 的内容为:ab\ncd 假设 test2.txt 的内容为:efg\nhi 输出样例:test3.txt 的内容:ab\ncdefg\nhi ``` ### 3 写入数据到文件 题目:编写程序,实现把从键盘敲入的字符数据都追加存入文件“test.txt”中,直到敲入 ctrl+z 结束, 注意是追加写入,也就是说文件中原本的内容依旧保留 输入:从键盘敲入字符,假设敲入了“abc\ndef”,原本的“test.txt“文件中的内容为“我爱中国” 输出:写入后的文件,按照输入的方式写入后,结果应该为:“我爱中国 abc\ndef“ --- ## 综合基础 ### 1.整数位逆序 题目:编写程序,实现把一个放在整型变量的整数的位数逆序,注意请用整形变量接收,例如某个 整形变量 n 存放了值 534,程序运行后 n 存放的值应该为 435 输入:一个整数 n 输出:逆序后的整数结果依旧存放在变量 n 中 ```ini 输入样例:534 输出样例:435 ``` ### 2.同构数 题目:正整数 n 如果是它的平方的尾部,则称为同构数,例如 5 的平方是 25,而 25 的尾部是 5, 所以 5 是一个同构数,请编写程序实现判断一个数是否是同构数,是的话输出yes,否则输出no 输入:一个整数 n 输出:判断是否是同构数,是的话输出 yes,否则输出no ```ini 输入样例:6 输出样例:yes ``` ### 3.提取整数 题目:给定一个含有数字字符和非数字字符的字符串,串长不超过 80,将其中连续的数字字符转 换为一个整数,如果连续的数字字符个数超过5 个则以 5 个数字字符为一组进行转换 编写函数:int extract(char *str,int arr[]),函数返回值为放入 a 数组中整数的个数,将转换后生 成的整数依次存放到整型数组arr 中并输出,用空格隔开 ```ini 输入:一个含有数字字符和非数字字符的字符串 输出:提取后的数组中的所有元素 输入样例:a123bc45!786#96def123456789 输出样例:123 45 786 96 12345 6789 ``` ### 4.字符去重 题目:给定一个全部是小写字母的字符数组,字符数组长度不超过 80,请去掉重复的字母,去重 后的字母顺序按照每种字母第一次出现的顺序排列 输入:一个全部是小写字母的字符串 输出:去 后的字符串 ```ini 输入样例:abdaabcedde 输出样例:abdce ``` ### 5.质因数分解 题目:从键盘输入整数 n(n>1),将 n 分解为若干质数(素数)之积,例如,当 n=10 时,输出结果 为:2,5,当 n=40 时,输出结果为:2,2,2,5 输入:一个整数 n 输出:n 的质因数,从小到大排列 ```ini 输入样例:30 输出样例:2 3 5 ``` --- ## 暴力枚举 ### 1.输出二元组 题目:给定一个整数 n,请输出 1-n 所有的两两组合且不重复的二元组 输入:一个整数 n 输出:每一行都输出一种二元组,用小括号包裹 ```ini 输入样例:3 输出样例:(1,2)(1,3)(2,3) ``` ### 2.百钱买百鸡 题目:公鸡 5 文钱一只,母鸡 3 文钱一只,小鸡 3 只一文钱,用 100 文钱买一百只鸡,其中公鸡, 母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足 100 文钱,设计程序,列举出 所有的满足题意的方案 输入:无 输出:按照一定格式输出所有的方案,要求所有方案按照公鸡数量递增的顺序陈列 ```ini 输出样例: 公鸡,母鸡,小鸡有:4 18 78 公鸡,母鸡,小鸡有:8 11 81 公鸡,母鸡,小鸡有:12 4 84 ``` ### 3.堵车问题 题目:假设在道路上只有三种车,小车长 1 米,中车长 2 米,大车长 3 米,同时假设堵车总长度为 n 米,请设计程序,计算出三种车的数量的可能的总数量,例如,当输入是 3 时,输出应该为 3, 因为所有的方案是“小车 3 个”、“小车 1 个,中车 1 个”、 “大车 1 个”,共 3 种 输入:一个整数 n,代表道路堵的长度 输出:所有可能的总数量 ```ini 输入样例:5 输出样例:5 ``` ### 4.井底之蛙 题目:一只长度不计的青蛙位于 n 米深的井的底部。它每次向上爬 u 米,但是必须休息一次才能 再次向上爬。在休息的时候,它滑落了 d 米。之后它将重复向上爬和休息的过程。青蛙爬出井口需 要至少爬多少次?如果青蛙爬完后刚好到达井的顶部,我们也认为它已经爬出井口 输入:三个整数 n,u,d,与题目中的 n,u,d 一致 输出:爬出进口的时间 ```ini 输入样例:10 3 2 输出样例:8 ``` ### 5.乘积数列 题目:已知某数列前两项为 2 和 3,其后继项根据当前的前两项的乘积按下列规则生成: 若乘积为一位数,则该乘积就是数列的后继项;若乘积为两位数,则乘积的十位和个位数字依次作 为数列的后继项,三位数以此类推例如:当 N=10,求出该数列的前十项为:2 3 6 1 8 8 6 4 2,已知乘积结果的数码长度小于 100,编写程序,求数列的第 m 项 ```ini 输入样例 10 输出样例:2 3 6 1 8 8 6 4 2 4(用空格隔开) ``` ### 6.约瑟夫环问题 题目:n 个人围成一圈,编号从 1 到 n,从第一个人从 1 开始报数,数到 m 的人出列,再由下一个 人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人 的编号 输入:两个正整数 n 和 m 输出:依次出圈人的编号,最后一个是最终胜利者的编号 ```ini 输入样例:10 3 输出样例:3 6 9 2 7 1 8 5 10 4 ``` ### 7.幸运数字 题目:幸运数是波兰数学家乌拉姆命名,它采用与生成素数类似的“筛法”生成,首先从 1 开始写出 自然数 1,2,3,4.... ,1 就是第一个幸运数,我们从 2 这个数开始。把所有序号能被2 整除的项 删除,变为: 1 _ 3 _ 5 _ 7 _ 9 .... ,把它们缩紧,重新记序,为: 1 3 5 7 9 .... ,这时,3 为第 2 个幸运数,然后把所有能被 3 整除的序号位置的数删去,注意,是序号位置,不是那个数本身能否 被 3 整除,删除的应该是 5,11, 17, ... ,此时 7 为第 3 个幸运数,以此类推 请你设计程序,计算出在 1 到 n 之间的所有幸运数 输入:一个整数 n 输出:第一行输出原始的数组,第二行及之后输出数组被逐轮删除索引后的结果,不要出现重复 ```ini 输入样例:10 输出样例: 1 2 3 4 5 6 7 8 9 10 1 3 5 7 9 1 3 7 9 ```