1511 lines
27 KiB
Markdown
1511 lines
27 KiB
Markdown
## 数组
|
||
|
||
### 1 数组的批量增
|
||
|
||
题目:设计程序,实现把一个数组的所有元素插入到另一个数组的指定索引位置
|
||
输入:第一行是第一个数组的元素个数len1,第二行是空格分开的len1 个元素,第三行是第二个
|
||
数组的元素个数len2,第四行是空格分开的len2 个元素,第五行是插入索引位置
|
||
输出:输出第二个数组插入到第一个数组后,第一个数组的所有元素
|
||
|
||
```ini
|
||
输入样例:
|
||
3
|
||
1 2 3
|
||
2
|
||
4 5
|
||
0
|
||
输出样例:4 5 1 2 3
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int a[100] = {0}, b[100] = {0};
|
||
int len1, len2, index;
|
||
int i;
|
||
|
||
scanf("%d", &len1);
|
||
for(i=0;i<len1;i++){
|
||
scanf("%d", a+i);
|
||
}
|
||
scanf("%d", &len2);
|
||
for(i=0;i<len2;i++){
|
||
scanf("%d", b+i);
|
||
}
|
||
scanf("%d", &index);
|
||
|
||
for(i=len1-1;i>=index;i--){
|
||
a[i+len2] = a[i];
|
||
}
|
||
for(i=0;i<len2;i++){
|
||
a[index+i]=b[i];
|
||
}
|
||
len1+=len2;
|
||
for(i=0;i<len1;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 2 数组的批量删
|
||
|
||
题目:设计程序,删除数组中所有值为x 的元素
|
||
输入:第一行是元素个数n,第二行是空格分开的n 个元素,第三行是需要删掉的标记值x
|
||
输出:删除后的数组
|
||
|
||
```ini
|
||
输入样例:
|
||
6
|
||
2 1 2 3 2 2
|
||
2
|
||
输出样例:1 3
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int a[100];
|
||
int len, i, j = 0, num;
|
||
|
||
scanf("%d", &len);
|
||
for(i=0;i<len;i++){
|
||
scanf("%d", a+i);
|
||
}
|
||
scanf("%d", &num);
|
||
for(i=0;i<len;i++){
|
||
if(a[i] != num){
|
||
a[j++] = a[i];
|
||
}
|
||
}
|
||
for(i=j;i<len;i++){
|
||
a[i]=0;
|
||
}
|
||
for(i=0;i<j;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
printf("\n");
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 3 左小右大
|
||
|
||
题目:输入一串整型正整数,设计程序,以第一个元素为基准,把比第一个元素小的都放在其左边,
|
||
比第一个元素大的放其右边,也就是“左小右大”的情况,且在此划分的前提下,要求左右两边的元
|
||
素位置相对次序依旧保持不变,也就是具有稳定性,且不开辟额外的数组空间
|
||
输入:第一行是元素个数n,第二行是空格分开的n 个元素,总长度不超过100
|
||
输出:按照规则“左小右大”划分后且相对次序保持不变后的数组
|
||
|
||
```ini
|
||
输入样例:
|
||
8
|
||
3 1 0 5 6 2 8 0
|
||
输出样例:1 0 2 0 3 5 6 8
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
void change(int a[], int n){
|
||
int i, j, t, index=0;
|
||
|
||
for(i=1;i<n;i++){
|
||
if(a[0] > 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<n-1;i++){
|
||
if(a[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<len;i++){
|
||
scanf("%d", a+i);
|
||
}
|
||
|
||
change(a, len);
|
||
|
||
for(i=0;i<len;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
printf("\n");
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 4 数组逆序
|
||
|
||
题目:编写程序,将给定的几个整数存入数组中,将数组中的这几个数逆序存放,再按顺序输出数
|
||
组中的元素
|
||
输入:输入在第一行中给出一个正整数n(1 ≤n≤ 10)。第二行输入几个整数,用空格分开
|
||
输出:在一行中输出这几个整数的处理结果,相邻数字中间用个空格分开
|
||
|
||
```ini
|
||
输入样例
|
||
4
|
||
10 8 1 2
|
||
输出样例:2 1 8 10
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
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<n;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
printf("\n");
|
||
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 5 数组循环右移
|
||
|
||
题目:设计程序,实现数组元素的整体循环右移
|
||
输入:第一行是元素个数n,第二行是空格分开的n 个元素,第三行是数组整体右移的步数step
|
||
输出:整体右移后的数组
|
||
|
||
```ini
|
||
输入样例:
|
||
4
|
||
1 2 3 4
|
||
2
|
||
输出样例:
|
||
3 4 1 2
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, step, t;
|
||
scanf("%d", &n);
|
||
int a[n];//C99及以上C语言标准中可以使用
|
||
for(int i=0;i<n;i++){
|
||
scanf("%d", &a[i]);
|
||
}
|
||
scanf("%d", &step);
|
||
|
||
for(int i=0;i<step;i++){//控制移动次数
|
||
t = a[0];
|
||
for(int j=0;j<n-1;j++){
|
||
a[j] = a[j+1];
|
||
}
|
||
a[n-1] = t;
|
||
}
|
||
for(int i=0;i<n;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
printf("\n");
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 6 最值交换
|
||
|
||
题目:编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数
|
||
交换,最后输出交换后的序列。题目保证最大和最小值都是唯一的
|
||
输入:输入在第一行中给出一个正整数N,第二行给出N 个整数,数字间以空格分隔
|
||
输出:在一行中顺序输出交换后的序列
|
||
|
||
```ini
|
||
输入样例:
|
||
5
|
||
8 2 5 1 4
|
||
输出样例:
|
||
1 2 5 4 8
|
||
```
|
||
|
||
**会改变其他元素位置**
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, max, min, t;
|
||
scanf("%d", &n);
|
||
int a[n];
|
||
max = min = 0;
|
||
for(int i=0;i<n;i++){
|
||
scanf("%d", &a[i]);
|
||
if(a[max] < a[i]){
|
||
max = i;
|
||
}
|
||
if(a[min] > 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<n;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
printf("\n");
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
**不会改变其他元素位置**
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, max, min, t;
|
||
scanf("%d", &n);
|
||
int a[n];
|
||
max = min = 0;
|
||
for(int i=0;i<n;i++){
|
||
scanf("%d", &a[i]);
|
||
if(a[max] < a[i]){
|
||
max = i;
|
||
}
|
||
if(a[min] > a[i]){
|
||
min = i;
|
||
}
|
||
}
|
||
|
||
for(int i=max;i<n-1;i++){
|
||
t = a[i];
|
||
a[i] = a[i+1];
|
||
a[i+1] = t;
|
||
}
|
||
if(max < min){
|
||
min--;
|
||
}
|
||
for(int i=min;i>=1;i--){
|
||
t = a[i];
|
||
a[i] = a[i-1];
|
||
a[i-1] = t;
|
||
}
|
||
|
||
for(int i=0;i<n;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
printf("\n");
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 7 数组排序
|
||
|
||
题目:输入一串整型正整数,设计程序,给输入的数组排序
|
||
输入:输入在第一行中给出一个正整数N(<10),第二行给出N 个整数,数字间以空格分隔
|
||
输出:递增排序后的数据
|
||
|
||
```ini
|
||
输入样例:
|
||
4
|
||
3 2 10 5
|
||
输出样例:2 3 5 10
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int a[10];
|
||
int n;
|
||
scanf("%d", &n);
|
||
|
||
for(int i=0;i<n;i++){
|
||
scanf("%d", &a[i]);
|
||
}
|
||
|
||
for(int i=0;i<n-1;i++){
|
||
for(int j=0;j<n-1-i;j++){
|
||
if(a[j] > a[j+1]){
|
||
int t = a[j];
|
||
a[j] = a[j+1];
|
||
a[j+1] = t;
|
||
}
|
||
}
|
||
}
|
||
|
||
for(int i=0;i<n;i++){
|
||
printf("%d ", a[i]);
|
||
}
|
||
printf("\n");
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 8 谁频次最高
|
||
|
||
题目:统计一个整型序列中出现次数最多的整数及其出现次数
|
||
输入:输入在一行中给出序列中整数个数N(0<N<1000),以及N 个整数。数字间以空格分隔
|
||
输出:在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字
|
||
是唯一的
|
||
|
||
```ini
|
||
输入样例:
|
||
11
|
||
10 3 2 -1 5 3 4 3 0 3 2
|
||
输出样例:3 4
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, max_count=0, max_num, t;
|
||
scanf("%d", &n);
|
||
|
||
int a[n];
|
||
|
||
for(int i=0;i<n;i++){
|
||
scanf("%d", &a[i]);
|
||
}
|
||
|
||
for(int i=0;i<n-1;i++){
|
||
t = 0;
|
||
for(int j=i+1;j<n;j++){
|
||
if(a[i] == a[j]){
|
||
t++;
|
||
}
|
||
}
|
||
if(t > max_count){
|
||
max_count = t;
|
||
max_num = a[i];
|
||
}
|
||
}
|
||
|
||
printf("%d %d\n", max_num, max_count+1);
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 9 矩阵运算
|
||
|
||
题目:给定一个𝑛 × 𝑛的方阵,请定义一个函数func,计算该矩阵除副对角线、最后一列和最后一
|
||
行以外的所有元素之和,副对角线为从矩阵的右上角至左下角的连线
|
||
输入:输入第一行给出正整数n(1 <n ≤ 10),随后n 行,每行给出n 个整数,以空格分隔
|
||
输出:在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和
|
||
|
||
```ini
|
||
输入样例:
|
||
4
|
||
2 3 4 1
|
||
5 6 1 1
|
||
7 1 8 1
|
||
1 1 1 1
|
||
输出样例:35
|
||
|
||
方阵中主对角线、副对角线的索引和方阵的行、列有什么关系?
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, s = 0;
|
||
scanf("%d", &n);
|
||
int a[n][n];
|
||
|
||
for(int i=0;i<n;i++){
|
||
for(int j=0;j<n;j++){
|
||
scanf("%d", &a[i][j]);
|
||
}
|
||
}
|
||
|
||
for(int i=0;i<n;i++){
|
||
for(int j=0;j<n;j++){
|
||
if(i != n-1 && j != n-1 && i+j != n-1){
|
||
s += a[i][j];
|
||
}
|
||
}
|
||
}
|
||
|
||
printf("%d\n", s);
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 10 矩阵乘积
|
||
|
||
题目:给定一个m×n的矩阵A,再给定一个给定一个n×p 的矩阵B(m,n,p<10)求矩阵的乘积
|
||
输入:第一行给出两个整数代表矩阵A 的维度m 和n,随后m 行每行输入以空格分隔的n 个整数,
|
||
第同时下一行给出两个整数代表矩阵B 的维度n 和p,随后n 行每行输入以空格分隔的p 个整数
|
||
输出:A 和B 相乘后的结果
|
||
|
||
```ini
|
||
输入样例:
|
||
2 3
|
||
1 2 3
|
||
4 5 6
|
||
3 2
|
||
1 0
|
||
0 1
|
||
1 2
|
||
输出样例:
|
||
4 8
|
||
10 17
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int m, n, s;
|
||
scanf("%d %d", &m, &n);
|
||
int a[m][n];
|
||
|
||
for(int i=0;i<m;i++){
|
||
for(int j=0;j<n;j++){
|
||
scanf("%d", &a[i][j]);
|
||
}
|
||
}
|
||
int q,p;
|
||
scanf("%d %d", &q, &p);
|
||
int b[q][p];
|
||
for(int i=0;i<q;i++){
|
||
for(int j=0;j<p;j++){
|
||
scanf("%d", &b[i][j]);
|
||
}
|
||
}
|
||
printf("\n");
|
||
for(int i=0;i<m;i++){//数组a行下标
|
||
for(int k=0;k<p;k++){//数组b的列下标
|
||
s = 0;
|
||
for(int j=0;j<n;j++){//数组a的列下标和数组b的行下标
|
||
s+= a[i][j] * b[j][k];
|
||
}
|
||
printf("%d ", s);
|
||
}
|
||
printf("\n");
|
||
}
|
||
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
<img src="https://yp.smallkun.cn/markdown/image-20250322222018779.png!compress" alt="image-20250322222018779" style="zoom:50%;" />
|
||
|
||
### 11 找字符索引
|
||
|
||
题目:编写程序,从给定字符串中查找某指定的字符所在的索引位置
|
||
输入:输入的第一行是单个待查找的字符。第二行是以回车结束的非空字符串(不超过80 个字符)
|
||
输出:如果找到,在一行内按照格式“index=下标”,输出该字符在字符串中所对应的下标(下标从0
|
||
开始),如果该字符出现多次,则返回最后一次出现的索引位置,否则输出"Not Found"
|
||
|
||
```ini
|
||
输入样例:
|
||
m
|
||
programming
|
||
输出样例:index=7
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
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 <stdio.h>
|
||
|
||
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 <stdio.h>
|
||
|
||
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 <stdio.h>
|
||
#include <string.h>
|
||
|
||
int main(){
|
||
int n, i, j;
|
||
scanf("%d", &n);
|
||
|
||
char str[n][80];
|
||
char temp[80];
|
||
|
||
for(i=0;i<n;i++){
|
||
scanf("%s", *(str+i));
|
||
}
|
||
|
||
for(i=0;i<n-1;i++){
|
||
for(j=0;j<n-1-i;j++){
|
||
if(strcmp(*(str+j), *(str+j+1)) == 1){
|
||
strcpy(temp, *(str+j));
|
||
strcpy(*(str+j), *(str+j+1));
|
||
strcpy(*(str+j+1), temp);
|
||
}
|
||
}
|
||
}
|
||
for(i=0;i<n;i++){
|
||
printf("%s\n", *(str+i));
|
||
}
|
||
|
||
|
||
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 15 字符串插入
|
||
|
||
题目:编写程序,实现字符串的插入
|
||
输入:输入总共三行,第一行是第一个字符串,第二行是第二个字符串,字符串的长度均小于100
|
||
且不包含换行符,第三行是代表第二个字符串插入至第一个字符串的位置
|
||
输出:把第二个字符串插入到第一个字符串的指定位置后面的结果
|
||
|
||
```ini
|
||
输入样例:
|
||
abc
|
||
ee
|
||
2
|
||
输出样例:aeebc
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
|
||
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<strlen(str2);i++){
|
||
p = str1+strlen(str1);
|
||
while(p>=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 <stdio.h>
|
||
#include <string.h>
|
||
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 <stdio.h>
|
||
|
||
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<x<1.0
|
||
输出:该浮点数的二进制表示方法
|
||
|
||
```ini
|
||
输入样例:0.7
|
||
输出样例:0.10110011001100110011001100110011
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
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 <stdio.h>
|
||
#include <string.h>
|
||
|
||
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<j;i++){
|
||
sum += t*b[i];
|
||
t*=2;
|
||
}
|
||
printf("(%s)B=(%d)D\n", str,sum);
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
### 4 二进制转十六进制
|
||
|
||
题目:给定一个二进制数,请输出其十六进制
|
||
输入:一串二进制表示的整数,长度不会超过 32
|
||
输出:转换成十六进制的结果,字母统一为大写
|
||
|
||
```ini
|
||
输入样例:111000001
|
||
输出样例:1C1
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
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
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
/*
|
||
字符串1:不超过200位的数字
|
||
字符串2:不超过200位的数字
|
||
*/
|
||
int main(){
|
||
char str1[200], str2[200], result[201];
|
||
int i, j, k=0, t = 0;
|
||
|
||
scanf("%s %s", str1, str2);
|
||
i=strlen(str1)-1;
|
||
j=strlen(str2)-1;
|
||
while(i>=0 || j>=0){
|
||
//555 555
|
||
//i:len-1 j:len-1
|
||
if(i >= 0) t+=str1[i--]-48;
|
||
if(j >= 0) t+=str2[j--]-48;
|
||
result[k++] = t%10+48;//这个位置相加后大于10则只读余数
|
||
t = t/10;
|
||
}
|
||
if(t != 0){
|
||
result[k++] = t+48;
|
||
}
|
||
while(k>0){
|
||
putchar(result[--k]);
|
||
}
|
||
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 6.大整数的乘法
|
||
|
||
题目:设计程序,求两个不超过 200 位的十进制非负整数的乘积
|
||
输入:有两行,每行是一个不超过 200 位的非负整数,不会有多余的前导 0
|
||
输出:一行,即相加后的结果。结果里不能有多余的前导 0
|
||
|
||
```ini
|
||
输入样例:
|
||
55555
|
||
1234567
|
||
输出样例:
|
||
68586369685
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
char str1[200], str2[200], result[400]={0};
|
||
int i, j, k, t = 0;
|
||
|
||
scanf("%s %s", str1, str2);
|
||
|
||
j=strlen(str2)-1;//下面的数的从个位开始的每一位的下标
|
||
while(j>=0){
|
||
i=strlen(str1)-1;//上面的数的每一位的下标
|
||
k=0;//上面数字的 0:个位 1:十位
|
||
t=strlen(str2)-j-1;//下面数字乘法的偏移量
|
||
while(i>=0){
|
||
result[k+t] += (str1[i]-48)*(str2[j]-48);
|
||
result[k+t+1] += result[k+t]/10;
|
||
result[k+t] %=10;
|
||
k++;
|
||
i--;
|
||
}
|
||
j--;
|
||
}
|
||
k+=strlen(str2);
|
||
while(result[k] == 0) k--;
|
||
|
||
while(k>=0){
|
||
putchar(result[k--]+48);
|
||
}
|
||
printf("\n");
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
---
|
||
|
||
## 文件
|
||
|
||
### 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)
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, i, j;
|
||
scanf("%d", &n);
|
||
|
||
for(i=1;i<n;i++){
|
||
for(j=i+1;j<=n;j++){
|
||
printf("(%d,%d)", i, j);
|
||
}
|
||
}
|
||
printf("\n");
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 2.百钱买百鸡
|
||
|
||
题目:公鸡 5 文钱一只,母鸡 3 文钱一只,小鸡 3 只一文钱,用 100 文钱买一百只鸡,其中公鸡,
|
||
母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足 100 文钱,设计程序,列举出
|
||
所有的满足题意的方案
|
||
输入:无
|
||
输出:按照一定格式输出所有的方案,要求所有方案按照公鸡数量递增的顺序陈列
|
||
|
||
```ini
|
||
输出样例:
|
||
公鸡,母鸡,小鸡有:4 18 78
|
||
公鸡,母鸡,小鸡有:8 11 81
|
||
公鸡,母鸡,小鸡有:12 4 84
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int i, j, k;
|
||
for(i=1;i<20;i++){
|
||
for(j=1;j<34;j++){
|
||
for(k=3;k<300;k+=3){
|
||
if(i*5+j*3+k/3 == 100 && i+j+k==100){
|
||
printf("公鸡,母鸡,小鸡有:%d %d %d\n", i, j, k);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 3.堵车问题
|
||
|
||
题目:假设在道路上只有三种车,小车长 1 米,中车长 2 米,大车长 3 米,同时假设堵车总长度为
|
||
n 米,请设计程序,计算出三种车的数量的可能的总数量,例如,当输入是 3 时,输出应该为 3,
|
||
因为所有的方案是“小车 3 个”、“小车 1 个,中车 1 个”、 “大车 1 个”,共 3 种
|
||
输入:一个整数 n,代表道路堵的长度
|
||
输出:所有可能的总数量
|
||
|
||
```ini
|
||
输入样例:5
|
||
输出样例:5
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int i, j, k, n, count = 0;
|
||
scanf("%d", &n);
|
||
for(i=0;i<=n;i++){
|
||
for(j=0;j<=n/2;j++){
|
||
for(k=0;k<=n/3;k++){
|
||
if(i+j*2+k*3 == n){
|
||
count++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
printf("%d\n", count);
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 4.井底之蛙
|
||
|
||
题目:一只长度不计的青蛙位于 n 米深的井的底部。它每次向上爬 u 米,但是必须休息一次才能
|
||
再次向上爬。在休息的时候,它滑落了 d 米。之后它将重复向上爬和休息的过程。青蛙爬出井口需
|
||
要至少爬多少次?如果青蛙爬完后刚好到达井的顶部,我们也认为它已经爬出井口
|
||
输入:三个整数 n,u,d,与题目中的 n,u,d 一致
|
||
输出:爬出进口的时间
|
||
|
||
```ini
|
||
输入样例:10 3 2
|
||
输出样例:8
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, u, d, t = 0;
|
||
scanf("%d %d %d", &n, &u, &d);
|
||
|
||
while(1){
|
||
t++;
|
||
n-=u;
|
||
if(n <= 0){
|
||
break;
|
||
}
|
||
n+=d;
|
||
}
|
||
printf("%d\n", t);
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 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(用空格隔开)
|
||
```
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
|
||
int main(){
|
||
int n, a=2, b=3, t, i;
|
||
|
||
scanf("%d", &n);
|
||
|
||
printf("%d %d ", a, b);
|
||
|
||
for(i=3;i<=n;i++){
|
||
if(a * b >= 10){
|
||
t = a*b;
|
||
if(i==n){
|
||
printf("%d", t/10);
|
||
break;
|
||
}
|
||
printf("%d %d ", t/10, t%10);
|
||
a = t/10;
|
||
b = t%10;
|
||
i+=2;
|
||
}else{
|
||
t = a*b;
|
||
printf("%d ", t);
|
||
a = b;
|
||
b = t;
|
||
}
|
||
}
|
||
|
||
|
||
return 0;
|
||
}
|
||
|
||
```
|
||
|
||
|
||
|
||
### 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
|
||
```
|
||
|