SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

C语言基础编程练习题

发表于 2020-03-03 更新于 2021-10-29 分类于 计算机 , 算法题 阅读次数: Valine:
本文字数: 14k 阅读时长 ≈ 13 分钟

排序

题目描述
  用对10个整数从小到大排序。

输入
  10个整数

输出
  排序好的10个整数

样例输入

1
4 85 3 234 45 345 345 122 30 12

样例输出

1
3 4 12 30 45 85 122 234 345 345

代码

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main() {

int num[10]={0};
int n=10;
int i,j;

for(i=0;i<n;i++)
scanf("%d",num+i);

for(i=0;i<n;i++)
for(j=i+1;j<n;j++){
if(num[j]<num[i]){
int t=num[j];
num[j]=num[i];
num[i]=t;
}
}

for(i=0;i<n;i++)
printf("%d ",num[i]);

return 0;
}

选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int main() {

int num[10]={0};
int n=10,min,t;
int i,j;

for(i=0;i<n;i++)
scanf("%d",num+i);

for(i=0;i<n;i++){
min=i;
for(j=i;j<n;j++){
if(num[j]<num[min]){
min=j;
}
}
t=num[i];
num[i]=num[min];
num[min]=t;
}

for(i=0;i<n;i++)
printf("%d ",num[i]);

return 0;
}

插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

int main() {

int num[10]={0};
int n=10,t;
int i,j;

for(i=0;i<n;i++)
scanf("%d",num+i);

for(i=0;i<n;i++){
t=num[i];
j=i-1;
while(j>=0 && t<num[j]){
num[j+1]=num[j];
j--;
}
num[j+1]=t;
}

for(i=0;i<n;i++)
printf("%d ",num[i]);

return 0;
}

希尔排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

int main() {

int num[10]={0};
int n=10,t,d;
int i,j;

for(i=0;i<n;i++)
scanf("%d",num+i);

d=n/2;
while(d>=1){
for(i=d;i<n;i++){
t=num[i];
j=i-d;
while(j>=0 && t<num[j]){
num[j+d]=num[j];
j-=d;
}
num[j+d]=t;
}
d/=2;
}

for(i=0;i<n;i++)
printf("%d ",num[i]);

return 0;
}

归并排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>

void merge(int num[],int n1,int n2,int n3){
int tmp[10]={0};
int i,j,k;
i=n1;
j=n2+1;
k=0;

while(i<=n2&&j<=n3){
if(num[i]<num[j])
tmp[k++]=num[i++];
else
tmp[k++]=num[j++];
}

while(i<=n2)
tmp[k++]=num[i++];

while(j<=n3)
tmp[k++]=num[j++];

for(i=n1,k=0;i<=n3;i++,k++)
num[i]=tmp[k];
}

void mergesort(int num[],int begin,int end){
if(begin<end){
int mid=(begin+end)/2;
mergesort(num,begin,mid);
mergesort(num,mid+1,end);
merge(num,begin,mid,end);
}
}

int main() {

int num[10]={0};
int n=10,t,d;
int i,j;

for(i=0;i<n;i++)
scanf("%d",num+i);

mergesort(num,0,n-1);

for(i=0;i<n;i++)
printf("%d ",num[i]);

return 0;
}

快速排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>

void quicksort(int num[],int begin,int end){
int i,j,t;
i=begin;
j=end;
t=num[i];

while(i<j){
while(i<j && t<num[j])j--;
if(i<j){
num[i]=num[j];
i++;
}

while(i<j && t>=num[i])i++;
if(i<j){
num[j]=num[i];
j--;
}
}

num[i]=t;

if(begin<i)
quicksort(num,begin,i-1);
if(i<end)
quicksort(num,i+1,end);
}

int main() {

int num[10]={0};
int n=10,t,d;
int i,j;

for(i=0;i<n;i++)
scanf("%d",num+i);

quicksort(num,0,n-1);

for(i=0;i<n;i++)
printf("%d ",num[i]);

return 0;
}

最大公约数与最小公倍数

题目描述
  输入两个正整数m和n,求其最大公约数和最小公倍数。

输入
  两个整数

输出
  最大公约数,最小公倍数

样例输入

1
5 7

样例输出

1
1 35

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
int main()
{
int a,b;

scanf("%d%d",&a,&b);

if(a<b){
int t=a;
a=b;
b=t;
}

int p=a*b;
int r;
while(b!=0){
r=a%b;
a=b;
b=r;
}

printf("%d %d\n",a,p/a);

return 0;
}

水仙花数

题目描述
  打印出所有”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为$153=1^3+5^3+3^3$。

输入
  无

输出
  输出每一个水仙花数,一个数占一行

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
int main()
{
for(int i =100 ;i<1000;i++){
int n1,n2,n3,t;
t=i;
n1=t%10;
t/=10;
n2=t%10;
t/=10;
n3=t%10;
if(n1*n1*n1+n2*n2*n2+n3*n3*n3==i)
printf("%d\n",i);
}
return 0;
}

完全数

题目描述
  一个数如果恰好等于不包含它本身所有因子之和,这个数就称为”完数”。 例如,6的因子为1、2、3,而6=1+2+3,因此6是”完数”。 编程序找出N之内的所有完数,并按下面格式输出其因子

输入
  N

输出
  ? its factors are ? ? ?

样例输入

1
1000

样例输出

1
2
3
6 its factors are 1 2 3 
28 its factors are 1 2 4 7 14
496 its factors are 1 2 4 8 16 31 62 124 248

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
int main()
{
int n;

scanf("%d",&n);

for(int i=2;i<=n;i++){

int s=0;

for(int j=1;j<i;j++){
if((i%j)==0)s+=j;
}

if(i==s){
printf("%d its factors are",i);
for(int j=1;j<i;j++)
if(i%j==0)
printf(" %d",j);
printf("\n");
}
}

return 0;
}

亲密数

题目描述
  两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。

输入
  无

输出
  3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号)
  一对亲密数只输出一次, 小的在前

样例输入
  无

样例输出

1
(220,284)(1184,1210)(2620,2924)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main()
{
int a, i, b, n;
printf("There are following friendly--numbers pair smaller than 3000:\n");
for( a=1; a<3000; a++ ) /*穷举3000以内的全部整数*/
{
for( b=0, i=1; i<=a/2; i++) /*计算数a的各因子,各因子之和存放于b*/
if(!(a%i))
b+=i;
for( n=0, i=1; i<=b/2; i++ ) /*计算b的各因子,各因子之和存于n*/
if(!(b%i))
n+=i;
if(n==a && a<b) /*使每对亲密数只输出一次*/
printf("(%d,%d)", a, b); /*若n=a,则a和b是一对亲密数,输出*/
}

return 0;
}

自守数

题目描述
  自守数是指一个数的平方的尾数等于该数自身的自然数。
  例如:
  25^2=625
  76^2=5776
  9376^2=87909376
  请求出200000以内的自守数?

输入
  无

输出
  200000以内的自守数(包括0, 数之间用两个空格分开,末尾无空格)

样例输入
  无

样例输出

1
0  1  5  6  25  76  376  625  9376  90625  109376

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <math.h>

int main(){
printf("0");
for(int i=1;i<=200000;i++){
int len=0;
for(int j=i;j>0;j/=10,len++);

int tail=0,t=i;
for(int j=0;j<len;j++){
tail+=(i*(t%10)%(int)pow(10,len-j))*pow(10,j);
t/=10;
}
tail%=(int)pow(10,len);

if(tail==i)
printf(" %d",i);
}

return 0;
}

求N之内的素数

题目描述
  求之N内的素数。

输入
  N

输出
  0~N的素数

样例输入

1
100

样例输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

代码

筛选法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <math.h>

int main() {

int num[10000]={0};
int n;
int i,j;

scanf("%d",&n);

for(i=2;i<=n;i++)
num[i]=i;

for(i=2;i<sqrt(n);i++){
for(j=i+1;j<=n;j++){
if(num[i]!=0 && num[j]!=0)
if(num[j]%num[i]==0)
num[j]=0;
}
}

for(i=2;i<=n;i++)
if(num[i]!=0)
printf("%d\n",i);

return 0;
}
枚举法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main() {

int n;

scanf("%d",&n);

if(n>=2)
printf("2\n");

for(int i=3;i<n;i+=2){
int f=1;
for(int j=3;j<i/2;j++)
if(i%j==0){
f=0;
break;
}
if(f)
printf("%d\n",i);
}

return 0;
}

猴子吃桃的问题

题目描述
  猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

输入
  N
输出
  桃子总数

样例输入

1
10

样例输出

1
1534

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main() {

int n;
int res=1;

scanf("%d",&n);

for(int i=1;i<n;i++){
res=(res+1)*2;
}

printf("%d",res);

return 0;
}

迭代法求平方根

题目描述
  用迭代法求平方根

  公式:求a的平方根的迭代公式为: X[n+1]=(X[n]+a/X[n])/2 要求前后两次求出的差的绝对值少于0.00001。 输出保留3位小数

输入
  X

输出
  X的平方根

样例输入

1
4

样例输出

1
2.000

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main()
{
int X;

scanf("%d",&X);

double x0,x1;
x0=X/2;
x1=(x0+X/x0)/2;
do{
x0=x1;
x1=(x0+X/x0)/2;

}while(x0-x1>=1e-5);

printf("%.3f",x1);

return 0;
}

百钱百鸡问题

题目描述
  中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
  翻译过来就是:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,用一百钱买一百只鸡,请问公鸡、母鸡、小鸡各多少只?

输入
  无输入

输出
  给出所有的解,每组解占一行
  解的顺序:按“字典序”排列,即公鸡数少的在前;公鸡数相同,母鸡数少的在前
  格式:

1
cock=%d,hen=%d,chicken=%d\n

样例输入
  无

样例输出

1
2
3
4
cock=0,hen=25,chicken=75
cock=4,hen=18,chicken=78
cock=8,hen=11,chicken=81
cock=12,hen=4,chicken=84

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main() {

for(int i=0;i*5<=100;i++){
for(int j=0;i*5+j*3<=100;j++){
if((100-i*5-j*3)*3+i+j==100)
printf("cock=%d,hen=%d,chicken=%d\n",i,j,(100-i*5-j*3)*3);
}
}

return 0;
}

判断闰年

题目描述
  给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串)

输入
  一个年份

输出
  根据是否闰年输出,是输出”L”,否输出”N”

样例输入

1
2000

样例输出

1
L

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

#define LEAP_YEAR(y) ((y%4==0 && y%100!=0)||(y%400==0))?1:0

int main(){

int year;
scanf("%d",&year);

if(LEAP_YEAR(year))
printf("L");
else
printf("N");

return 0;
}

三天打鱼两天晒网

题目描述
  如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2011 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。

输入
  需要判断的日期

输出
  打鱼还是晒网

样例输入

1
2011 1 4

样例输出

1
晒网

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
int leap(int a) /*自定义函数leap()用来指定输入的年份是否为闰年*/
{
if (a%4==0&&a%100!=0||a%400==0) /* 闰年判定条件 */
return 1; /*是闰年返回1*/
else
return 0; /*不是闰年返回O*/
}

int number(int year,int month,int day) /*自定义函数 number() 计算输入日期距2011年1月1日共有多少天*/
{
int sum = 0, i, j, k;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /*数组a存放平年每月的天数*/
int b[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /*数组b存放闰年每月的天数*/
if(leap(year)==1) /*判断是否为闰年*/
for(i=0;i<month-1;i++)
sum+=b[i]; /*是闰年,累加数组b前m-1个月份的天数*/
else
for(i=0;i<month-1;i++)
sum+=a[i]; /*不是闰年,累加数组a前m-1个月份的天数*/
for(j=2011;j<year;j++)
if (leap(j)==i)
sum+=366; /*2011年到输入的年份是闰年的加366*/
else
sum+=365; /*2011年到输入的年份不是闰年的加365*/
sum+=day; /*将前面累加的结果加上日期,求出总天数*/
return sum; /*返回计算的天数*/
}

int main()
{
int year,month,day,n;
scanf("%d%d%d",&year,&month,&day); /*输入年月日*/
n=number(year,month,day); /*调用函数 number()*/
if((n%5)<4&&(n%5)>0) /*余数是1或2或3时说明在打渔,否则在晒网*/
printf("打鱼\n");
else
printf("晒网\n");
return 0;
}

单词个数统计

题目描述
  编写一个程序,输入一个字符串(长度不超过80),然后统计出该字符串当中包含有多少个单词。例如:字符串“this is a book”当中包含有4个单词。

输入
  输入一个字符串,由若干个单词组成,单词之间用一个空格隔开。

输出
  输出一个整数,即单词的个数。

样例输入

1
this is a book

样例输出

1
4

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

int main() {

char str[255]={0};

gets(str);//使用gets可将带空格的整行字符串读入

int w=0,sum=0;

for(int i=0;str[i]!='\0';i++){
if(str[i]!=' '){
if(w==0){
w=1;
sum++;
}
}
else{
w=0;
}
}

printf("%d",sum);

return 0;
}

杨辉三角

题目描述
  还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1

输入
  输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<=30),表示将要输出的杨辉三角的层数。

输出
  对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。

样例输入

1
2 3

样例输出

1
2
3
4
5
6
1
1 1

1
1 1
1 2 1

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int main() {

int num[1000]={0};
int n;

while(~scanf("%d",&n)){

for(int i=1;i<=n;i++){
for(int j=i-1;j>=0;j--){
if(j==0)
num[j]=1;
else if(j==i-1)
num[j]=1;
else
num[j]=num[j]+num[j-1];
}

for(int j=0;j<i;j++)
printf("%d ",num[j]);
printf("\n");
}
printf("\n");
}

return 0;
}

汉诺塔

题目描述
  汉诺塔是一种古老的游戏。
  一共3个柱子,标号为1,2,3
  1号柱子有从大到小一共n个盘子。
  每次移动最上方的一个盘子,可以移动到其他的柱子。
  任何一个盘子,都不能叠在比它更小的盘子的上方。
  请把盘子从1号柱子,全部移动到3号柱子。

输入
  一个数,n,表示盘子的数量(n<=10)

输出
  输出若干行。
  每次操作,输出一行。输出“Move x from x to x”的格式。
  最小盘子的编号为1,最大盘子的编号为n。

样例输入

1
4

样例输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Move 1 from 1 to 2
Move 2 from 1 to 3
Move 1 from 2 to 3
Move 3 from 1 to 2
Move 1 from 3 to 1
Move 2 from 3 to 2
Move 1 from 1 to 2
Move 4 from 1 to 3
Move 1 from 2 to 3
Move 2 from 2 to 1
Move 1 from 3 to 1
Move 3 from 2 to 3
Move 1 from 1 to 2
Move 2 from 1 to 3
Move 1 from 2 to 3

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

void hanoi(int from,int by,int to,int n){

if(n==1)
printf("Move %d from %d to %d\n",1,from,to);
else{
hanoi(from,to,by,n-1);
printf("Move %d from %d to %d\n",n,from,to);
hanoi(by,from,to,n-1);
}
}

int main() {

int n;

scanf("%d",&n);

hanoi(1,2,3,n);

return 0;
}

判断回文字符串

代码

支持中英文混合的版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <string.h>

int main(){

char str[255];
int len=0;
int res=1;

scanf("%s",str);
len=strlen(str);

for(int i=0,j=len-1;i<j;i++,j--){
if(str[i]<0){
if(i+1==j)
break;
if(!(str[i]==str[j-1] && str[i+1]==str[j])){
res=0;
break;
}
i++;
j--;
}
else{
if(!(str[i]==str[j])){
res=0;
break;
}
}
}

if(res)
printf("Yes\n");
else
printf("No\n");

return 0;
}

求回文素数

题目描述
  小王对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在小王想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);

输入
  输入a和b(5 <= a < b <= 100,000,000)

输出
  按从小到大输出a,b之间所有满足条件的素数回文数

样例输入

1
5 500

样例输出

1
2
3
4
5
6
7
8
9
10
11
12
5
7
11
101
131
151
181
191
313
353
373
383

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <string.h>
#include <math.h>

int isPrime(int n){
if(n==2)
return 1;

if(n%2==0)
return 0;

for(int i=3;i<=sqrt(n);i++)
if(n%i==0)
return 0;

return 1;
}

int isPalindrome(int n){
char str[255]={0};
sprintf(str,"%d",n);

int len=strlen(str);
for(int i=0;i<len/2;i++)
if(str[i]!=str[len-i-1])
return 0;

return 1;
}

int main(){

int a,b;

scanf("%d %d",&a,&b);

for(int i=a;i<=b;i++)
if(isPrime(i) && isPalindrome(i))
printf("%d\n",i);

return 0;
}
-------- 本文结束 感谢阅读 --------
相关文章
  • 算法常用模板:并查集
  • 寻找无向图最小着色方案
  • 《C语言程序设计(第五版)谭浩强》课后习题答案源码
  • OpenCV3使用中遇到的一些问题
  • Qt使用中遇到的一些问题
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: C语言基础编程练习题
  • 本文作者: SiriYang
  • 创建时间: 2020年03月03日 - 10时03分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20200303105746id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
C/C++ 算法题
OpenCV3中SVM的使用
考研计算机网络简答题背诵
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 排序
    1. 冒泡排序
    2. 选择排序
    3. 插入排序
    4. 希尔排序
    5. 归并排序
    6. 快速排序
  2. 最大公约数与最小公倍数
  3. 水仙花数
  4. 完全数
  5. 亲密数
  6. 自守数
  7. 求N之内的素数
  8. 猴子吃桃的问题
  9. 迭代法求平方根
  10. 百钱百鸡问题
  11. 判断闰年
  12. 三天打鱼两天晒网
  13. 单词个数统计
  14. 杨辉三角
  15. 汉诺塔
  16. 判断回文字符串
  17. 求回文素数
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%