class-notes/C语言基础进阶合集版编程题.md
2025-04-03 11:55:09 +08:00

1511 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 数组
### 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 的矩阵Bm,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 *strint 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 时,输出结果
25当 n=40 时,输出结果为:2225
输入:一个整数 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 米。之后它将重复向上爬和休息的过程。青蛙爬出井口需
要至少爬多少次?如果青蛙爬完后刚好到达井的顶部,我们也认为它已经爬出井口
输入:三个整数 nud与题目中的 nud 一致
输出:爬出进口的时间
```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 开始写出
自然数 1234.... 1 就是第一个幸运数,我们从 2 这个数开始。把所有序号能被2 整除的项
删除,变为: 1 _ 3 _ 5 _ 7 _ 9 .... ,把它们缩紧,重新记序,为: 1 3 5 7 9 .... 这时3 为第 2
个幸运数,然后把所有能被 3 整除的序号位置的数删去,注意,是序号位置,不是那个数本身能否
被 3 整除,删除的应该是 511, 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
```