C语言大学生考试全面题库(2):经典题目与解答 | 南锋

南锋

南奔万里空,脱死锋镝余

C语言大学生考试全面题库(2):经典题目与解答

分割自然数游戏

题目描述:
周末强强在家做作业,遇到了这样一道题,找出N位(N<8)的自然数中具有下列性质的数:如果将这个数字从中间开始分割成两部分,然后将这两部分相加,所得到的和的平方,等于原来那个数的(奇数的时候,中间的那个数字靠前)。从键盘输入N,直接在屏幕上输出答案。找不到满足要求的数时候,输出"NO FOUND"。强强想了许久也没想出来,想请你来帮忙,那么你该如何来帮助他呢?

输入描述:
输入N
输出描述描述:
符合条件的N位整数
样式输入:

4

样式输出:

2025
3025
9801

源代码

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
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,j,x1,x2,sum=0,min,max,k;
int a[10];
scanf("%d",&n);
min=pow(10,n-1);//划分整数段。
max=pow(10,n);
if(n!=1)
{
for(i=min;i<max;i++)
{
k=pow(10,n/2);//划分分割段。
x1=i%k;//右边的数。
x2=i/k;//左边的数。
if((x1+x2)*(x1+x2)==i)
{
a[sum]=i;
sum++;
}
}
if(sum==0)
printf("NO FOUND");
else
{
for(j=0;j<sum-1;j++)
printf("%d\n",a[j]);
printf("%d",a[sum-1]);
}
}
else
printf("NO FOUND");
return 0;
}

乐乐摘苹果

题目描述:
一天乐乐去果园玩,发现一棵苹果树上结出10个苹果。乐乐跑去摘苹果。乐乐找到一个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。 现在已知10个苹果到地面的高度,以及乐乐把手伸直的时候能够达到的最大高度,请帮乐乐算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入描述:
输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。
第二行只包括一个100到120之间(包含100和120) 的整数(以厘米为单位),表示乐乐把手伸直的时候能够达到的最大高度。
输出描述描述:
输出包括一行,这一行只包含一个整数,表示乐乐能够摘到的果的数目。
样式输入:

100 200 150 140 129 134 167 198 200 111
110

样式输出:

5

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
int a[10],i,sum=0,n;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
scanf("%d",&n);
for(i=0;i<10;i++)
if(a[i]<=n+30)
sum++;
printf("%d",sum);
return 0;
}

不高兴的津津

题目描述:
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。(津津一天上课的时间应分为两部分:在学校的时间和在复习班的时间,这两个时间相加就是津津一天上课的时间。如果这个时间大于八小时津津就会不高兴。)
输入描述:
输入包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间
输出描述:
输出包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
样式输入:

5 3
6 2
7 2
5 3
5 4
0 4
0 6

样式输出:

3

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
int main()
{
int a,b;
int max,k,i;
max=8;
for(i=0;i<7;i++)
{
scanf("%d %d",&a,&b);
if(a+b>max)
{
max=a+b;
k=i+1;
}
}
if(max==8)
printf("0\n");
else
printf("%d\n",k);
return 0;
}

最低位(二进制的转换)

题目描述:
任意一个正整数A(1<=A<=109),输出它的最低位。例如,A=26,我们能写出它的二进制位11010,所以最低位是10,输出为2。再例如,A=88,则二进制位1011000,则最低位是1000,输出为8。
输入描述:
输入包含一个整数A(1<=A<=109)
输出描述:
对应输入的最低位
样式输入:

8

样式输出:

8

源代码

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>
#include<math.h>
int main()
{
int n,i=0,j,z,a[8],b[8],s=0;
scanf("%d",&n);
while(n)
{
a[i]=n%2;
n/=2;
i++;
}
for(j=0;j<i;j++)
{
b[j]=a[j];
if(a[j]==1)
break;
}
for(z=0;z<=j;z++)
if(b[z]!=0)
s+=pow(2,z);
printf("%d",s);
return 0;
}

Fibonacci数列

题目描述:
Fibonacci数列{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …},可以如下定义:
F0=0
F1=1
Fi=F(i-1)+F(i-2) 对于所有的i大于2
写个程序计算Fibonacci数
输入描述:
第一行为需要测试个数T,接着的T行,每一行包含一个数n(0<=n<=45 ),即你需要计算的F(n)
输出描述:
每输入一个数n,输出对应的F(n)
样式输入:

5
0
3
5
9
20

样式输出:

0
2
5
34
6765

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main()
{
int n,i,k,a[46];
scanf("%d",&n);
a[0]=0;
a[1]=1;
for(i=2;i<=45;i++)
a[i]=a[i-1]+a[i-2];
for(i=0;i<n;i++)
{
scanf("%d",&k);
printf("%d",a[k]);
if(i<n-1)
printf("\n");
}
return 0;
}

蛇形矩阵

题目描述:
蛇形矩阵是从1开始的自然数依次排列成的一个矩阵上三角形
输入描述:
矩阵的大小N(N<20)
输出描述描述:
输出一个蛇形矩阵,注意:每行行末没有空格,最后一行没有换行。
样式输入:

5

样式输出:

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

源代码

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 n,a[20]={1},i,j;
int N,k,z,s;
scanf("%d",&N);
n=N;
for(i=0,z=1;i<N-1;i++)
{
s=i+2;
for(j=1;j<n;j++)
{
a[j]=a[j-1]+s;
s++;
}
for(k=0;k<n-1;k++)
printf("%d ",a[k]);
printf("%d\n",a[n-1]);
a[0]+=z;
z++;
n--;
}
printf("%d",a[0]);
return 0;
}

猪的安家

题目描述:
Andy和Mary养了很多猪。他们想要给猪安家。但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。Andy都快疯了。你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。
输入描述:
输入包含多组测试数据。每组数据第一行包含一个整数n (n <= 10),表示Andy建立猪圈的次数,接下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。你可以假定(ai, aj) = 1
输出描述描述:
输出包含一个正整数,即为Andy家至少养猪的数目

样式输入:

3
3 1
5 1
7 2

源代码

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,ai,bi;
int i,j,k,a[1000],s=1000;
scanf("%d",&n);
for(i=0;i<1000;i++)
a[i]=i+1;
for(i=0;i<n;i++)
{
scanf("%d %d",&ai,&bi);
k=0;
for(j=0;j<s;j++)
if(a[j]%ai==bi)
{
a[k]=a[j];
k++;
}
s=k;
}
if(k!=0)
printf("%d",a[0]);
return 0;
}

最大乘积的整数的拆分

题目描述:
将一个整数N分解成各不相同的加数的和,使这些加数的乘积最大。N范围为[5,1000]
输入描述:
输入一个整数N(5<=N<=1000)
输出描述描述:
能够使得积最大的加数序列
样式输入:

7

样式输出:

3 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
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n%3==1)
{
n-=4;
while(n)
{
printf("3 ");
n-=3;
}
printf("4");
}
else if(n%3==2)
{
printf("2");
n-=2;
while(n)
{
printf(" 3");
n-=3;
}
}
else
{
printf("3");
n-=3;
while(n)
{
printf(" 3");
n-=3;
}
}
return 0;
}

插队

题目描述:
编写程序,对一个已经排好序的数组,输入一个元素。将该元素按原来的排序规则将它插入到数组中。
例如原数组为:1 2 6 7 9,输入待插入的元素3,则插入完成后结果为:1 2 3 6 7 9;
输入描述:
输入包含两部分,第一部分先输入n,表示数组中元素个数,接着输入n个已经排序好的数,数组最大个数n为20,第二部分为待插入的数据
输出描述描述:
新的排序好的数组元素
样式输入:

5
1 2 6 7 9
3

样式输出:

1 2 3 6 7 9

源代码

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 a[101],n,i,j;
int s,temp;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&s);
for(i=0;i<n;i++)
{
if(a[i]>s)
{
for(j=n;j>i;j--)
a[j]=a[j-1];
a[i]=s;
break;
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("%d",a[n]);
return 0;
}

2源代码

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 i,a[21],n,m,k=0,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=0;i<n;i++)
if(a[i]>m)
{
k=1;
for(j=n;j>i;j--)
a[j]=a[j-1];
a[i]=m;
break;
}
if(k==0)
a[n]=m;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("%d",a[n]);
return 0;
}

卫星定位

题目描述:
编写程序,对一个已经排好序的数组,输入一个元素。将该元素在数组中的位置索引出来(折半查找)。
例如原数组为:1 2 6 7 9,输入待查找的元素7,则查找结果为4,如果没有找到该元素,则输出-1;
输入描述:
输入包含两部分,第一部分先输入n,表示数组中元素数,接着输入n个已经排序好的数,数组最大个数n为20,第二部分为待查找的数据
输出描述描述:
待查找的元素位置
样式输入:

5
1 2 6 7 9
7

样式输出:

4

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main()
{
int i,a[20],n,m,k=-1;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=0;i<n;i++)
if(a[i]==m)
{
k=i+1;
break;
}
printf("%d",k);
return 0;
}

警察抓贼

题目描述:
编写程序,将n(n<1000)个元素中的某个特定元素删除。如果该元素出现的次数t为奇数次,则删除第(t+1)/2那个,如果出现的次数t为偶数次,则删除第(t/2)个
输入描述:
输入包含两部分,第一部分先输入n,接着输入n个原数据。第二部分为待删除的元素;
输出描述描述:
删除特定元素后的剩余元素
样式输入:

8
1 3 4 6 3 5 3 6
3

样式输出:

1 3 4 6 5 3 6

源代码

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
#include<stdio.h>
int main()
{
int n,a[1000];
int s,i,t=0,m,j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&s);
for(i=0;i<n;i++)
if(a[i]==s)
t++;
if(t%2!=0)
m=(t+1)/2;
else
m=t/2;
for(i=0;i<n-1;i++)
{
if(a[i]!=s)
printf("%d ",a[i]);
else
{
j++;
if(j!=m)
printf("%d ",a[i]);
}
}
if(a[n-1]!=s)
printf("%d ",a[n-1]);
else
{
j++;
if(j!=m)
printf("%d ",a[n-1]);
}
return 0;
}

2源代码

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 n,a[1000];
int s,i,t=0,m,j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&s);
for(i=0;i<n;i++)
if(a[i]==s)
t++;
if(t%2!=0)
m=(t+1)/2;
else
m=t/2;
for(i=0;i<n;i++)
{
if(a[i]!=s)
printf("%d ",a[i]);
else
{
j++;
if(j!=m)
printf("%d ",a[i]);
}
}
return 0;
}

是非黑白

题目描述:
编写函数实现两个等长字符串大小比较。比较规则如下:字符大小按对应的ASCII 码值,字符串大小比较时按对应字符比较,如果比较的两字符不等,则说明存在大小关系,停止比较操作。如果相等,则比较下一次字符,直到最后一个。如果第一个字符串小于第二个字符串则输出第二个字符串,如果大于则输出第一个字符串,如果相等则返回0;
输入描述:
输入待比较的两个字符串
输出描述描述:
字符串比较结果
样式输入:

abcdefg
abcdeff

样式输出:

abcdefg

源代码

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
#include<stdio.h>
#include<string.h>
int main()
{
char a[81],b[81];
int i,len1,len2,max,s1=0,s2=0;
scanf("%s",a);
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
max=(len1>len2)?len1:len2;
for(i=0;i<len2;i++)
{
if(a[i]<b[i])
{
s2++;
break;
}
if(a[i]>b[i])
{
s1++;
break;
}
}
if(s1==1)
puts(a);
if(s2==1)
puts(b);
if(s1==0 && s2==0)
{
if(len1>len2)
puts(a);
else if(len1<len2)
puts(b);
else
printf("0");
}
return 0;
}

搭桥

题目描述:
编写函数将两个升序排列的字符串融合成一个字符串,融合后的字符串仍然是升序排列的。
输入描述:
输入两升序字符串
输出描述描述:
融合后的字符串
样式输入:

acefi
bdfg

样式输出:

abcdeffgi

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>
#include<string.h>
int main()
{
char a[162],b[81];
int i,j,len,temp;
scanf("%s",a);
scanf("%s",b);
strcat(a,b);
len=strlen(a);
for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
puts(a);
return 0;
}

2源代码

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>
#include<string.h>
int main()
{
char a[162],b[81];
int i,j,len,temp;
scanf("%s",a);
scanf("%s",b);
strcat(a,b);
len=strlen(a);
for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
puts(a);
return 0;
}

一清二楚

题目描述:
输入一字符串,该字符串包含字母、数字和其他字符。统计该字符串中数字、字母和其他字符出现的频率。(注意,其他字符包含空格)
输入描述:
一混合字符串,最大长度为200
各类字符出现频率
输出描述描述:
各类字符出现频率
样式输入:

abcdefg9999////

样式输出:

ch:7
num:4
other:4

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<string.h>
int main()
{
char a[200];
int ch=0,num=0,other=0,len,i;
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]>='0' && a[i]<='9')
num++;
else if((a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z'))
ch++;
else
other++;
}
printf("ch:%d\nnum:%d\nother:%d",ch,num,other);
return 0;
}

2源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<string.h>
int main()
{
char a[200];
int ch=0,num=0,other=0,len,i;
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]>='0' && a[i]<='9')
num++;
else if((a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z'))
ch++;
else
other++;
}
printf("ch:%d\nnum:%d\nother:%d",ch,num,other);
return 0;
}

克隆

题目描述:
编写程序实现字符串拷贝,输入两字符串(字符串长度小于100),将第一个字符串拷贝到第二个字符串中;如果第一个字符串的长度a小于第二个字符串长度b,则第二个字符串的长度也将缩减至第一个的长度a,如果第一个字符串的长度a大于或等于第二个长度b,则只将a的前b个字符拷贝到第二个中;
输入描述:
输入两字符串
输出描述描述:
输出第二个字符串,注意:输出不换行。
样式输入:

Abdfeg
Bdfad

样式输出:

Abdfe

源代码

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>
#include<string.h>
int main()
{
1: char a[100],b[100];
int len1,len2,i;
scanf("%s %s",a,b);
len1=strlen(a);
len2=strlen(b);
if(len1<len2)
{
for(i=0;i<len1;i++)
b[i]=a[i];
b[len1]='\0';
}
else
{
for(i=0;i<len2;i++)
b[i]=a[i];
}
puts(b);
return 0;

}

2源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<string.h>
int main()
{
int len1,len2,i;
char a[100],b[100];
gets(a);
gets(b);
len1=strlen(a);
len2=strlen(b);
if(len1<len2)
for(i=0;i<len1;i++)
printf("%c",a[i]);
else
{
for(i=0;i<len2;i++)
printf("%c",a[i]);
}
return 0;
}

四则运算程序

题目描述:
编制一个完成两个数的四则运算程序(加、减、乘、除)。如:用户输入34+56则输出结果34.00+56.00=90.00。要求运算结果保留两位小数,用户输入时一次将两个数和操作符输入。
数字可能是整数,也可能是浮点数。
知识点:格式输出,格式输入,条件语句
输入描述:
包含5组测试数据,每一组占一行,每一行包含数字和字符,运算结果不超过double范围。
输出描述描述:
两个数的运算的结果,如果运算符不为加、减、乘、除,则输出Input Error! 每个数字保留两位小数精度。
样式输入:

1+1
1-1
1*1
1/1
1^1

样式输出:

1.00+1.00=2.00
1.00-1.00=0.00
1.00*1.00=1.00
1.00/1.00=1.00
Input Error!

源代码

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
#include<stdio.h>
int main()
{
double a,b,s;
char c;
while(scanf("%lf%c%lf",&a,&c,&b)!=EOF)
{
if(c=='+')
{
s=a+b;
printf("%.2lf%c%.2lf=%.2lf\n",a,c,b,s);
}
else if(c=='-')
{
s=a-b;
printf("%.2lf%c%.2lf=%.2lf\n",a,c,b,s);
}
else if(c=='*')
{
s=a*b;
printf("%.2lf%c%.2lf=%.2lf\n",a,c,b,s);
}
else if(c=='/')
{
s=a/b;
printf("%.2lf%c%.2lf=%.2lf\n",a,c,b,s);
}
else
printf("Input Error!\n");

}
return 0;

}

落体球反弹

题目描述:
一球从某个高度(大于等于100米)自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?。(保证6位精度)
输入描述:
高度为大于等于100米的实数,范围在double内。
输出描述描述:
第10次落地时,经过多少米,第10次反弹高度。
样式输入:

100

样式输出:

299.609375
0.097656

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main()
{
int i=0,k=10;
double sn,h,sum,n;
scanf("%lf",&n);
sum=n;
while(i<k)
{
sn=n/2.0;
sum+=(2*sn);
n=sn;
i++;
}
printf("%.6lf\n%.6lf",sum-(2*sn),sn);
return 0;
}

电话薄管理

题目描述:
利用结构体类型数组输入五位用户的姓名和电话号码,按姓名的字典顺序排列后(姓名相同保持原位置),输出用户的姓名和电话号码。 已知结构体类型如下:

1
2
3
4
 struct user 
{ char name[20];
char num[10];
};

输入描述:
输入姓名字符串和电话号码字符串。
输出描述描述:
输出按姓名排序后的姓名字符串和电话号码字符串。每行的最后一个字符后不能有空格.所有输出的最后一行不能有回车
样式输入:

aa
12345
dd
23456
cc
34567
bb
21456
ee
12456

样式输出:

aa
12345
bb
21456
cc
34567
dd
23456
ee
12456

源代码

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
#include<stdio.h>
#include<string.h>
struct user
{ char name[20];
char num[10];
};
int main()
{
int n=5,i=0,j;
char temp1[20],temp2[10];
struct user user[5];
while(n)
{
scanf("%s",user[i].name);
scanf("%s",user[i].num);
i++;
n--;
}
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
if(strcmp(user[i].name,user[j].name)>0)
{
strcpy(temp1,user[i].name);
strcpy(user[i].name,user[j].name);
strcpy(user[j].name,temp1);
strcpy(temp2,user[i].num);
strcpy(user[i].num,user[j].num);
strcpy(user[j].num,temp2);
}
for(i=0;i<4;i++)
printf("%s\n%s\n",user[i].name,user[i].num);
printf("%s\n%s",user[4].name,user[4].num);
return 0;
}

校门外的树

题目描述:
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入描述:
输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出描述描述:
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。所有输出的最后一行不能有回车
样式输入:

500 3
150 300
100 200
470 471

样式输出:

298

源代码

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>
int main()
{
int L,M,sum,i,min,max;
int a[10000];
scanf("%d%d",&L,&M);
sum=L+1;
for(i=0;i<=L;i++)
a[i]=1;
while(M)
{
scanf("%d%d",&min,&max);
for(i=min;i<=max;i++)
a[i]=0;
M--;
}
for(i=0;i<=L;i++)
if(a[i]==0)
sum--;
printf("%d",sum);
return 0;

}

歌手比赛

题目描述:
青年歌手参加歌曲大奖赛,有10个评委对她的进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。
输入描述:
10个评委的分数,每个分数是一个浮点数.输入数据保证有一个最低分,一个最高分,且最高分,最低分不相同.其它是数据与最低、最高均不相同
输出描述描述:
输出歌手的得分,保留一位小数.所有输出的最后一行不能有回车
样式输入:

8.5 9 9.8 6.5 8.7 8.5 9.3 9.6 8.9 8.2

样式输出:

8.8

源代码

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>
int main()
{
double a[10],min,max,sum=0;
int i;
for(i=0;i<10;i++)
scanf("%lf",&a[i]);
max=a[0];
min=a[0];
for(i=1;i<10;i++)
{
if(max<a[i])
max=a[i];
if(min>a[i])
min=a[i];
}
for(i=0;i<10;i++)
sum+=a[i];
sum-=max+min;
sum=sum/8.0;
printf("%.1lf",sum);
return 0;
}

二维数组转置

题目描述:
编程实现使给定的一个N×M的二维整型数组转置,即行列互换。
输入描述:
第一行是两个整数N和M ,接下来N行整数,每行包含M个整数。整数之间用空格隔开
输出描述描述:
输出转置后的二维整型数组.每一个数据之间用一个空格隔开,但每行的最后一个数据后不能有空格.所有输出的最后一行不能有回车
样式输入:

2 3
1 2 3
4 5 6

样式输出:

1 4
2 5
3 6

源代码

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[100][100],i,j,n,m;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
for(i=0;i<m-1;i++)
{
for(j=0;j<n-1;j++)
printf("%d ",a[j][i]);
printf("%d\n",a[n-1][i]);
}
for(i=0;i<n-1;i++)
printf("%d ",a[i][m-1]);
printf("%d",a[n-1][m-1]);
return 0;
}

魔方矩阵

题目描述:
输入一奇数n(n<20),打印出1->nn构成的魔方矩阵。
魔方矩阵的行列及对角线的和都相等。
输入描述:
输入一奇数n(n<20)
**输出描述描述:**
打印出1->n
n构成的魔方矩阵,每一个数据之间用一个空格隔开,但每行的最后一个数据后不能有空格.所有输出的最后一行不能有回车
样式输入:

3

样式输出:

8 1 6
3 5 7
4 9 2

源代码

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include<stdio.h>
int main()
{
int a[20][20],i,j,n,k=1,m1,m2;
scanf("%d",&n);
for(i=0;i<20;i++)
for(j=0;j<20;j++)
a[i][j]=0;
while(k!=n*n+1)
{
if(k==1)
{
a[0][n/2]=1;
m1=0;
m2=n/2;
}
else
{
if(m1==0&&m2!=n-1)
{
if(a[n-1][m2+1]==0)
{
a[n-1][m2+1]=k;
m1=n-1;
m2++;
}
else
{
a[m1+1][m2]=k;
m1++;
}
}
else if(m2==n-1&&m1!=0)
{
if(a[m1-1][0]==0)
{
a[m1-1][0]=k;
m1--;
m2=0;
}
else
{
a[m1+1][m2]=k;
m1++;
}
}
else
{
if(a[m1-1][m2+1]==0)
{
a[m1-1][m2+1]=k;
m1--;
m2++;
}
else
{
a[m1+1][m2]=k;
m1++;
}
}
}
k++;
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][n-1]);
}
for(j=0;j<n-1;j++)
printf("%d ",a[n-1][j]);
printf("%d",a[n-1][n-1]);
return 0;
}

统计

题目描述:
统计个位数为6的n位数,且能被m整除的共有多少个?
输入描述:
一个整数n(n<=5),表示该整数的位数,一个整数m(1~9);
输出描述描述:
符合条件的数的个数。
样式输入:

2 3

样式输出:

3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<math.h>
int main()
{
int m,n,i,sum=0,min,max;
scanf("%d%d",&n,&m);
min=pow(10,n-1);
max=pow(10,n);
for(i=min;i<max;i++)
if(i%10==6)
if(i%m==0)
sum++;
printf("%d",sum);
return 0;
}

四位数

题目描述:
计算满足下述条件的四位数的个数:把数字abcd重新组成两个新的两位数:ac及db,
如果新组成的两个十位数ac>db,且ac必须是偶数且能被n(n为1~9的整数)整除,db必须是奇数,同时两个新数的十位数字均不为零。
输入描述:
一个1~9的整数。
输出描述描述:
符合条件的数的个数。
样式输入:

5

样式输出:

180

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
int n,s,i,x,y,sum=0;
scanf("%d",&n);
for(i=1000;i<10000;i++)
{
x=i%10+i/100%10*10;
y=i/10%10+i/1000%10*10;
if(x<y && y%n==0 && y%2==0 && x%2==1 && x/10!=0 &&y/10!=0)
sum++;
}
printf("%d",sum);
return 0;
}

密码翻译

题目描述:
把某字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z,b改写成a,大写字母和其它字符保持不变,并输出翻译后的字符数组。
输入描述:
输入要翻译的密码字符串(长度小于100)
输出描述描述:
翻译后的字符串。
样式输入:

Adb Bcdza

样式输出:

Aca Bbcyz

源代码

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<string.h>
int main()
{
int len,i;
char a[100];
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]>='a'&&a[i]<='z')
{
if(a[i]=='a')
a[i]='z';
else
a[i]--;
}
}
for(i=0;i<len;i++)
printf("%c",a[i]);
return 0;
}

身高预测

题目描述:
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传、饮食习惯与坚持体育锻炼等。小孩成人后身高与其父母身高和自身性别密切相关。
设faHeight为其父身高,moHeight为其母身高,身高预测公式为:
男性成人时身高 = (faHeight + moHeight) * 0.54(cm)
女性成人时身高 = (faHeight * 0.923 + moHeight) / 2(cm)
此外,如果喜爱体育锻炼,那么可增加身高2%,如果有良好的卫生饮食习惯,那么可增加身高1.5%。
编程从键盘输入你的性别(用字符型变量存储,输入字符f表示女性,输入字符m表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量存储,输入字符y表示喜爱,输入字符n表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量存储,输入字符y表示喜爱,输入字符n表示不喜爱),利用给定公式和身高预测方法对你的身高进行预测。
输入描述:
从键盘输入性别、父母身高、是否喜爱体育锻炼、是否有良好的饮食习惯等条件。
输出描述描述:
身高(cm)。
样式输入:

f
165
155
y
y

样式输出:

159.07

源代码

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()
{
double a,b,c,k=1;
char ch1,ch2,ch3;
scanf("%c",&ch1);
scanf("%lf%lf",&a,&b);
getchar();
scanf("%c",&ch2);
getchar();
scanf("%c",&ch3);
if(ch1=='f')
{
c=(a*0.923+b)/2.0;
if(ch2=='y')
c*=1.02;
if(ch3=='y')
c*=1.015;
}
else
{
c=(a+b)*0.54*k;
if(ch2=='y')
c*=1.02;
if(ch3=='y')
c*=1.015;
}
printf("%.2lf",c);
return 0;
}

大奖赛现场统分

题目描述:
编写一个为某大奖赛现场统分的程序,在评委打分之后,及时通报评分结果。已知某大奖赛有n个选手参赛,m(m>2)个评委依次为参赛的选手评判打分,最高10分,最低0分。
统分规则为:在每个选手所得的m个得分中,去掉一个最高分,去掉一个最低分后,取平均分为该选手的最后得分。
要求编程实现:根据n个选手的最后得分,从高到低排出名次表,以便确定获奖名单。
输入描述:
按以下顺序输入数据,数据之间用空格或回车间隔:
选手人数n(不超过40),
评委人数m(不超过20),
第1位选手的编号,
m个评委的打分,
第2个选手的编号,
m个评委的打分
第n位选手的编号,
m个评委的打分。
输出描述描述:
分行打印每个选手的名次,编号,最后得分,选手得分保留一位小数。
样式输入:

5
5
11
9.5 9.6 9.7 9.4 9.0
12
9.0 9.2 9.1 9.3 8.9
13
9.6 9.7 9.5 9.8 9.4
14
8.9 8.8 8.7 9.0 8.6
15
9.0 9.1 8.8 8.9 9.2

样式输出:

1 13 9.6
2 11 9.5
3 12 9.1
4 15 9.0
5 14 8.8

源代码

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
52
53
54
55
56
57
#include<stdio.h>
int main()
{
int n,m,i=0,j,z,a[40];
int k1,k2;
double c[40]={0},b[40][20],f,min,max,temp;
scanf("%d",&n);
scanf("%d",&m);
z=n;
while(z)
{
scanf("%d",&a[i]);
for(j=0;j<m;j++)
scanf("%lf",&b[i][j]);
i++;
z--;
}
for(i=0;i<n;i++)
{
max=b[i][0];
min=b[i][0];
k1=0;
k2=0;
for(j=1;j<m;j++)
{
if(b[i][j]>max)
{
max=b[i][j];
k1=j;
}
if(b[i][j]<min)
{
min=b[i][j];
k2=j;
}
}
for(z=0;z<m;z++)
if(z!=k1 && z!=k2)
c[i]+=b[i][z];
f=m-2;
c[i]/=f;
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(c[i]<c[j])
{
temp=c[i];
c[i]=c[j];
c[j]=temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for(i=0;i<n;i++)
printf("%d %d %.1lf\n",i+1,a[i],c[i]);
return 0;
}

礼炮声响次数

题目描述:
在庆祝活动中。A,B,C三条军舰要同时开始鸣礼炮各n(n为整数)响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请问观众总共可以听到几次礼炮声?
输入描述:
一个整数(n)
输出描述描述:
一个整数,即听到礼炮声的次数m。
样式输入:

21

样式输出:

54

源代码

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 n,sum,i;
int a[21]={0},b[21]={0},c[21]={0};
scanf("%d",&n);
sum=3*n-2;
for(i=1;i<=5*(n-1);i++)
{
if(i%5==0&&i%6==0&&i%7==0)
sum-=2;
if((i%5==0&&i%6==0)||(i%5==0&&i%7==0)||(i%6==0&&i%7==0))
sum--;
}
for(i=5*(n-1)+1;i<=6*(n-1);i++)
if(i%6==0&&i%7==0)
sum--;
printf("%d",sum);
return 0;
}

产值翻番计算

题目描述:
假设当年工业产值为100,工业产值的增长率每年为c%,从键盘输入一个c(0<=c<=30),试求工业产值过多少年可实现翻番(即增加一倍)。
注:后一年的产值是在前一年的基础上增长c%。
输入描述:
一个0~30的实数(增长率)。
输出描述描述:
实现翻番的年数。
样式输入:

6

样式输出:

12

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
int c,yy=0;
float m=100,k;
scanf("%d",&c);
k=c/100.0;
while(m<200)
{
yy++;
m+=k*m;
}
printf("%d",yy);
return 0;
}

福利彩票(双色球)

题目描述:
现在买彩票成为一种发财致富的途径,当然中奖的机会还是比较少,特别是大奖。
其游戏规则如下: 彩民从133中选择六个随机的号码,作为红球号码,从116中选择一个号码作为篮球号码。这样一共有7个号码。
中奖规则是:与开奖号码相比,
一等奖,红色号码和蓝色号码必须完全一样;
二等奖,六个红色号码相同,但蓝色号码不同;
三等奖5个红色号码相同(不分先后顺序)和一个蓝色号码相同;
四等奖,5个红色号码相同并且蓝色号码不同 或者 4个红色号码相同并且蓝色号码相同;
五等奖 4个红色号码相同并且蓝色号码不同 或者 3个红色号码相同并且蓝色号码相同;
六等奖 蓝色号码必须相同,红色号码可以为0、1、2个。
其他的号码属于没中奖
输入描述:
输入第一行是7个整数,表示开奖号码,前面六个是红色球号码,最后一个是篮球号码,接下来的5行,每行包含合法的彩票号码(前面六个是红色球号码,最后一个是篮球号码),每个号码之间用空格隔开。
输出描述描述:
对于每一个彩票号码,在一行中 输出其相应的奖励等级,一等奖为1,二等奖为2,三等奖为3,四等奖为4,五等奖为5,六等奖为6,无奖为0。
样式输入:

23 1 8 9 28 16 9
2 3 4 5 6 22 9
2 3 4 5 6 22 9
2 3 4 5 6 22 9
2 3 4 5 6 22 9
2 3 4 5 6 22 9

样式输出:

6
6
6
6
6

源代码

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
#include<stdio.h>
int main()
{
int a[7],b[7],i,sum=0;
for(i=0;i<7;i++)
scanf("%d",&a[i]);
while(scanf("%d %d %d %d %d %d %d",&b[0],&b[1],&b[2],&b[3],&b[4],&b[5],&b[6])!=EOF)
{
for(i=0;i<6;i++)
if(a[i]==b[i])
sum++;
if(sum==6&&a[6]==b[6])
printf("1\n");
else if(sum==6&&a[6]!=b[6])
printf("2\n");
else if(sum==5&&a[6]==b[6])
printf("3\n");
else if((sum==5&&a[6]!=b[6])||(sum==4&&a[6]==b[6]))
printf("4\n");
else if((sum==4&&a[6]!=b[6])||(sum==3&&a[6]==b[6]))
printf("5\n");
else if(a[6]==b[6])
printf("6\n");
else
printf("0\n");
sum=0;
}
return 0;
}

移动数列

题目描述:
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
输入描述:
输入总数n(0~20的整数),后移位数m(m<n),输入n个整数,间隔以空格。

输出描述:
移动后的数列。
样式输入:

8
3
1 2 3 4 5 6 7 8

样式输出:

6 7 8 1 2 3 4 5

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main()
{
int a[20],i,n,m,b[20],k=0;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=n-1;i>=n-m;i--)
{
b[k]=a[i];
k++;
}
for(i=n-1;i>=m;i--)
a[i]=a[i-m];
for(i=k-1;i>=0;i--)
printf("%d ",b[i]);
for(i=m;i<n-1;i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);
return 0;
}

行李托运

题目描述:
铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超过50公斤,超过部分每公斤按0.25元计费。请编程实现自动计费功能。
输入描述:
输入一个整数,表述要托运的行李的重量,单位为公斤
输出描述:
托运的行李重量(单位公斤)空格和运费(单位为元,保留2位小数)。
样式输入:

45

样式输出:

45 6.75

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main()
{
int n;
double sum=0;
scanf("%d",&n);
printf("%d ",n);
if(n<=50)
sum+=0.15*n;
else
sum+=0.15*50+0.25*(n-50);
printf("%.2lf",sum);
return 0;
}

分数比较

题目描述:
请编程实现比较两个分数的大小。(注:进行分数的通分后再比较分子的大小)
输入描述:
输入两个分数,格式为分子/分母 分子/分母,分子,分母均为整数。
输出描述描述:
输出比较后的结果。如果等于,则输出分子/分母=分子/分母;如果小于分子/分母<分子/分母;如果大于,则输出分子/分母>分子/分母
样式输入:

1/2 1/3

样式输出:

1/2>1/3

源代码

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 a,b,c,d,x,y;
scanf("%d/%d %d/%d",&a,&b,&c,&d);
x=a*d;
y=b*c;
if(a<0 || c<0)
{
if(a>0 && c<0)
printf("%d/%d>%d/%d",a,b,c,d);
if(a<0 && c>0)
printf("%d/%d<%d/%d",a,b,c,d);
if(a<0 && c<0)
if(x>y)
printf("%d/%d<%d/%d",a,b,c,d);
else if(x==y)
printf("%d/%d=%d/%d",a,b,c,d);
else
printf("%d/%d>%d/%d",a,b,c,d);
}
else
if(x>y)
printf("%d/%d>%d/%d",a,b,c,d);
else if(x==y)
printf("%d/%d=%d/%d",a,b,c,d);
else
printf("%d/%d<%d/%d",a,b,c,d);
return 0;
}

求人数

题目描述:
定义一个函数,功能是计算n个学生的成绩中,高于平均成绩的人数,并作为函数值。用主函数来调用它,统计50个学生成绩中,高于平均成绩的有多少人?
输入描述:
输入50个学生的成绩
输出描述描述:
输出一个整数表示高于平均成绩的人数

样式输入:

45 46 47 48 49 50 41 52 53 54
55 56 57 58 59 60 61 62 63 64
65 66 67 68 69 70 71 72 73 74
75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94

样式输出:

25

源代码

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>
int avg(int a[50])
{
int i,sum=0;
double k=0;
for(i=0;i<50;i++)
k+=a[i];
k/=50.0;
for(i=0;i<50;i++)
if(a[i]>k)
sum++;
return sum;
}
int main()
{
int a[50],n,i;
for(i=0;i<50;i++)
scanf("%d",&a[i]);
n=avg(a);
printf("%d",n);
return 0;
}

e数列

题目描述:
┌ e(1)=e(2)=1,
└ e(n)=(n-1)*e(n-1)+(n-2)*e(n-2) (n>2) 称为e数列,
每一个e(n) (n=1,2,…)称为e数。求[1,m]之内:
(1)最大的e数。
(2)e数的数目
输入描述:
输入一个整数,表示m的值,m<300000;
输出描述描述:
输出两个整数,第一个表示最大的e数,第二个表示e数的数目;
样式输入:

30000

样式输出:

16687
8

源代码

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 e[20]={1,1,1},m,j,i=2,max;
scanf("%d",&m);
while(e[i]<=300000)
{
i++;
e[i]=(i-1)*e[i-1]+(i-2)*e[i-2];
}
for(j=1;j<i;j++)
{
if(e[j]<=m)
max=e[j];
else
break;
}
printf("%d\n%d",max,j-1);
return 0;
}

运算符++前置后置练习(胡宁静)

题目描述:
程序部分代码如下,写出一个完整的程序,输出m,n的值。
int i=8,j=10,m,n;
m=++i;
n=j++;
m=++j;
n=i++;
输入描述:
无输入
输出描述描述:
输出m,n的值(不含回车,m n中间有一空格)
样式输入:

样式输出:

12 9

源代码

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
main()
{
int i=8,j=10,m,n;
m=++i;
n=j++;
m=++j;
n=i++;
printf("%d %d",m,n);
}

按格式要求显示日期

题目描述:
接收用户从键盘输入的日期信息并将其显示出来。其中,输入日期的形式为月/日/年(即mm/dd/yyyy),输出日期的形式为年月日(即yyyymmdd)。
输入描述:
以形式为“月/日/年”(即mm/dd/yyyy)的格式,输入一个日期。
输出描述描述:
以形式为年月日(即yyyymmdd)输出日期。

样式输入:

2/17/2010

样式输出:

20100217

源代码

1
2
3
4
5
6
7
#include<stdio.h>
main()
{
int y,m,d;
scanf("%d/%d/%d",&m,&d,&y);
printf("%d%02d%02d",y,m,d);
}

求圆的周长和面积

题目描述:
从键盘输入圆的半径,求该圆的周长和面积。(注: 取3.14)
输入描述:
一个实数r。
输出描述描述:
圆的周长和面积。
样式输入:

1

样式输出:

r=1.00,l=6.28,s=3.14

源代码

1
2
3
4
5
6
7
8
#include<stdio.h>
#define PI 3.14
main()
{
float r,l,s;
scanf("%f",&r);
printf("r=%.2f,l=%.2f,s=%.2f",r,2*PI*r,PI*r*r);
}

计算分段函数

题目描述:
计算分段函数
y=x (x<0)
y=0 (x=0)
y=sqrt(x) (x>0)
输入x,打印出y值。
输入描述:
一个实数x。
输出描述描述:
x的值和分段函数y的值。
样式输入:

0

样式输出:

x=0.000000,y=0.000000

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include<math.h>
main()
{
double x,z;
scanf("%lf",&x);
if(x>0)
z=sqrt(x);
else if(x==0)
z=0;
else
z=x;
printf("x=%lf,y=%lf",x,z);
}

确定一个数的位数

题目描述:
编写程序用来确定一个数的位数。如:
输入: 567
输出:The number 567 has 3 digits
假设输入的数最多不超过四位。
输入描述:
一个整数n。
输出描述描述:
按指定格式输出这个数的位数。
样式输入:

567

样式输出:

The number 567 has 3 digits

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
main()
{
int n,digits=1,k;
scanf("%d",&n);
k=n;
if(n>9)
{
while(n/10>0)
{
digits++;
n/=10;
}
printf("The number %d has %d digits",k,digits);
}
else
printf("The number %d has 1 digit",k);
}

显示某个数的英文单词

题目描述:
用switch语句编写一个程序,要求用户输入一个两位的整数,显示这个数的英文单词。例如:输入45,显示forty-five。注意:对11~19要进行特殊处理。
输入描述:
一个两位的整数n。
输出描述描述:
这个数的英文单词。
样式输入:

45

样式输出:

forty-five

源代码

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
#include<stdio.h>
main()
{
int n,s,m;//s为十位数,m为个位数。
scanf("%d",&n);
switch(n)
{
case 10:printf("ten");break;
case 11:printf("eleven");break;
case 12:printf("twelve");break;
case 13:printf("thirteen");break;
case 14:printf("fourteen");break;
case 15:printf("fifteen");break;
case 16:printf("sixteen");break;
case 17:printf("seventeen");break;
case 18:printf("eighteen");break;
case 19:printf("nineteen");break;
}
s=n/10;
m=n%10;
if(s>1)
{
switch(s)
{
case 2:printf("twenty");break;
case 3:printf("thirty");break;
case 4:printf("fourty");break;
case 5:printf("fifty");break;
case 6:printf("sixty");break;
case 7:printf("seventy");break;
case 8:printf("eightty");break;
case 9:printf("ninety");break;
}
switch(m)
{
case 0:printf("");break;
case 1:printf("-one");break;
case 2:printf("-two");break;
case 3:printf("-three");break;
case 4:printf("-four");break;
case 5:printf("-five");break;
case 6:printf("-six");break;
case 7:printf("-seven");break;
case 8:printf("-eight");break;
case 9:printf("-nine");break;
}
}
}

找出最大数

题目描述:
用户从键盘输入若干个数,当输入0或负数时输出这些数中的最大非负数。注意,输入的数不要求一定是整数。
输入描述:
输入若干个数,最后一个为0或负数。
输出描述描述:
最大非负数。
样式输入:

2.3
6.3
5.4
0

样式输出:

max=6.300000

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
main()
{
float max=0,n;
scanf("%f",&n);
while(n>0)
{
if(max<n)
max=n;
scanf("%f",&n);
if(n==0)
break;
}
printf("max=%f",max);
}

求最简分式

题目描述:
用户输入一个分数,要求将其约分,输出最简分式。例如:输入3/12,输出1/4。提示:为了把分式化简为最简分式,首先求分子和分母的最大公约数,然后分子和分母分别除以最大公约数。
输入描述:
一个分数。
输出描述描述:
最简分式。
样式输入:

3/12

样式输出:

最简分数为1/4

源代码

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
main()
{
int n,m,i;
scanf("%d/%d",&n,&m);
for(i=n;i>0;i--)
if(n%i==0 && m%i==0)
{
printf("最简分数为%d/%d",n/i,m/i);
break;
}
}

计算多项式的和

题目描述:
计算从2~n的自然数中偶数的和,即2+4+6+8+…的值。
注意:n可能是偶数,也可能是奇数。
输入描述:
一个整数n。
输出描述描述:
从2~n的自然数中偶数的和。
样式输入:

100

样式输出:

sum=2550

源代码

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
main()
{
int n,sum=0,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
if(i%2==0)
sum+=i;
printf("sum=%d",sum);
}

阶乘累加

题目描述:
计算1!+2!+3!……+n!
输入描述:
一个整数n(n<=20)。

输出描述描述:
1到n的阶乘累加之和。
样式输入:

5

样式输出:

s=153

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
main()
{
int n,s=0,m,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1,m=1;j<=i;j++)
m*=j;
s+=m;
}
printf("s=%d",s);
}

计算e的近似值

题目描述:
利用泰勒级数
e=1+1/1!+1/2!+……+1/n!,
计算e的近似值。精度要求最后一项的绝对值小于f(如:f=1e-5)。
输入描述:
精度。
输出描述描述:
e的近似值,保留6位小数。
样式输入:

1e-5

样式输出:

e=2.718282

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
main()
{
int n,m=1,i,k;
float e=1,s;
scanf("%f",&s);
for(n=1;;n++)
{
for(i=1,k=1;i<=n;i++)
k*=i;
m=k;
e+=1.0/m;
if(1.0/m<s)
break;
}
printf("e=%f",e);
}

计算sinx的值

题目描述:
利用泰勒级数
sinx=x-x^3/3!+x^5/5!-x^7/7!+……
计算sinx的值。要求最后一项的绝对值小于1e-5,并统计出此时累加的项数。
输入描述:
一个实数x(一个角度的弧度数)
输出描述描述:
sinx的值和累加的项数。
样式输入:

1.57

样式输出:

sinx=1.000000,n=6

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<math.h>
void main()
{
int n=1,s=3,j,m=1;
double sinx,x,z,i=3;
scanf("%lf",&x);
sinx=x;
do
{
for(j=1,m=1;j<=s;j++)
m*=j;
z=(pow(-1,n)*pow(x,i))/m;
sinx+=z;
n++;
i+=2;
s+=2;
}while(fabs(z)>=1e-5);
printf("sinx=%lf,n=%d",sinx,n);
}

题目描述:
打印n(三位的整数)以内的所有水仙花数。所谓水仙花数是指一个三位的整数,其各位数字的立方和等于该数本身。例如:153是水仙花数,因为153=1^3+5^3+3^3。
输入描述:
一个整数n。
输出描述描述:
符合条件的水仙花数。
样式输入:

400

样式输出:

153
370
371

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
main()
{
int n,i,j,k,r;
scanf("%d",&n);
for(i=100;i<=n;i++)
{
j=i%10;
k=(i%100)/10;
r=i/100;
if(i==j*j*j+k*k*k+r*r*r)
printf("%d\n",i);
}
}

打印ASCII码值、字符对照表

题目描述:
打印码值为n1~n2( n1和n2的值在33~127范围内)的ASCII码值、字符对照表。
输入描述:
两个整数n1和n2(值在33~127范围内)。
输出描述描述:
对照表。要求:ASCII码值占7列,字符占9列,向右对齐,每行打3个码值。
样式输入:

65
70

样式输出:
65 A 66 B 67 C
68 D 69 E 70 F
源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
void main()
{
int n1,n2,i,j;
scanf("%d",&n1);
scanf("%d",&n2);
for(i=n1,j=1;i<=n2;i++,j++)
{
printf("%7d%9c",i,i);
if(j%3==0)
printf("\n");
}
}

第n年时有多少头母牛?

题目描述:
递增的牛群:若一头小母牛,从第4年开始每年生一头小母牛。按此规律,第n年时有多少头母牛?
输入描述:
一 个整数n(n>=4 && n<=20)。
输出描述描述:
第n年时的母牛数。
样式输入:

4

样式输出:

2

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
void main()
{
int n,f,f1,f2,f3,i;
scanf("%d",&n);
for(i=4,f1=f2=f3=1;i<=n;i++)
{
f=f1+f3;
f3=f2;
f2=f1;
f1=f;

}
printf("%d",f);
}

百马百担问题

题目描述:
百马百担问题:有n1匹马,驮n2担货,大马驮3担,中马驮2担,两匹小马驮1担,问有多少种驮法?
注意:每种马至少有1匹.
输入描述:
两个整数n1(马匹数)和n2(担货数)。
输出描述描述:
驮法数。
样式输入:

100 100

样式输出:

6

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
main()
{
int n1,n2,sum=0,x,y,z;//x,y,z分别为大马匹数,中马匹数和小马匹数。
scanf("%d %d",&n1,&n2);
for(x=1;x<=n1;x++)
{
for(y=1;y<=n1-x;y++)
{
z=n1-x-y;
if((3*x+2*y+0.5*z)==n2)
sum++;
}
}
printf("%d",sum);
}

求可行的购鱼方案

题目描述:
有钱m元,要买金鱼n条。市场上的金鱼主要有三个品种,价格分别为:红狮头每条0.9元,黑骑士每条1.2元,白金刚每条1.6元。如果每一个品种都至少购买一条,要买足n条金鱼,且正好用完n元。试编写程序求出可行的购鱼方案。
输入描述:
两个整数m(钱数)和n(金鱼总数)。
输出描述描述:
购鱼方案。注:一种方案打一行,按红狮头、黑骑士、白金刚的顺序打出条数,数据之间留一个空格。
样式输入:

30 25

样式输出:

4 18 3
8 11 6
12 4 9

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
void main()
{
int n,m,i,j;
double k;
scanf("%d%d",&m,&n);
for(i=1;i<=m/1.6;i++)
{
for(j=1;j<=(m-1.6*i)/1.2;j++)
{
k=1.6*i+1.2*j+0.9*(n-i-j);
if(k==m)
printf("%d %d %d\n",n-i-j,j,i);
}
}
}

最低位(二进制的转换)

题目描述:
任意一个正整数A(1<=A<=109),输出它的最低位。例如,A=26,我们能写出它的二进制位11010,所以最低位是10,输出为2。例如,A=88,则二进制位1011000,则最低位是1000,输出为8。再例如A=7,则二进制位111,则最低位是1,输出为1。
输入描述:
输入包含一个整数A(1<=A<=109)
输出描述描述:
对应输入的最低位(输出不包含回车)
样式输入:

8

样式输出:

8

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<math.h>
#define N 10
main()
{
int A,law,a[N],i,j;
scanf("%d",&A);
for(i=0;i<=N;i++)
{
a[i]=A%2;
A/=2;
if(a[i]==1)
break;
}
law=pow(2,i);
printf("%d",law);
}

Fibonacci数列

题目描述:
Fibonacci数列{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …},可以如下定义:
F0=0
F1=1
Fi=F(i-1)+F(i-2) 对于所有的i大于2
写个程序计算Fibonacci数
输入描述:
第一行为需要测试个数T,接着的1行,输入T个数据,每一个数据包含一个数n(0<=n<=45 ),即你需要计算的F(n)
输出描述描述:
对每输入的数n,输出对应的F(n),每个F(n)之间包含一个空格,最后一行输出不含回车。

样式输入:

5
0 3 5 9 20

样式输出:

0 2 5 34 6765

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
int main()
{
int n,i,k;
int b[46]={0,1},a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=2;i<=45;i++)
{
b[i]=b[i-1]+b[i-2];
}
for(i=0;i<n-1;i++)
{
k=a[i];
printf("%d ",b[k]);
}
k=a[n-1];
printf("%d",b[k]);
return 0;
}

源代码

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>
int main()
{
int n,i,k;
int b[46]={0,1},a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=2;i<=45;i++)
{
b[i]=b[i-1]+b[i-2];
}
for(i=0;i<n-1;i++)
{
k=a[i];
printf("%d ",b[k]);
}
k=a[n-1];
printf("%d",b[k]);
return 0;
}

蛇形矩阵1—一个方向生成(胡宁静)
题目描述:
蛇形矩阵是从1开始的自然数依次排列成的一个矩阵上三角形。注意看样式输出。
输入描述:
矩阵的大小N(N<20)
输出描述描述:
输出一个蛇形矩阵,注意:每行行末没有空格,最后一行没有换行。
样式输入:

5

样式输出:

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

源代码

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 n,a[20]={1},i,j;
int N,k,z,s;
scanf("%d",&N);
n=N;
for(i=0,z=1;i<N-1;i++)
{
s=i+2;
for(j=1;j<n;j++)
{
a[j]=a[j-1]+s;
s++;
}
for(k=0;k<n-1;k++)
printf("%d ",a[k]);
printf("%d\n",a[n-1]);
a[0]+=z;
z++;
n--;
}
printf("%d",a[0]);
return 0;
}

蛇形矩阵2—双向生成

题目描述:
蛇形矩阵是从1开始的自然数依次排列成的一个矩阵上三角形。注意看样式输出。
输入描述:
矩阵的大小N(N<20)
输出描述描述:
输出一个蛇形矩阵,注意:每行行末没有空格,最后一行没有换行。
样式输入:

5

样式输出:

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

源代码

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
#include<stdio.h>
int main()
{
int n,a[20][20]={1},i,j;
int N,k,z,s,f;
int temp;
scanf("%d",&N);
n=N;
for(i=0,z=1;i<N;)
{
s=i+2;
for(j=1;j<n;j++)
{
a[i][j]=a[i][j-1]+s;
s++;
}
i++;
a[i][0]=a[i-1][0]+z;
z++;
n--;
}
n=N;
for(i=2;i<N;i+=2)
{
f=i;
for(k=0,j=0;k<=i/2;k++)
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
i--;
j++;
}
i=f;
}
for(i=0;i<N-1;i++)
{
for(k=0;k<n-1;k++)
printf("%d ",a[i][k]);
printf("%d\n",a[i][n-1]);
n--;
}
printf("%d",a[N-1][0]);
return 0;
}

猪的安家

题目描述:
Andy和Mary养了很多猪。他们想要给猪安家。但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。Andy都快疯了。你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。
输入描述:
输入包含多组测试数据。每组数据第一行包含一个整数n (n <= 10),表示Andy建立猪圈的次数,接下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。你可以假定(ai, aj) = 1
输出描述描述:
输出包含一个正整数,即为Andy家至少养猪的数目
样式输入:

3
3 1
5 1
7 2

样式输出:

16

源代码

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,ai,bi;
int i,j,k,a[1000],s=1000;
scanf("%d",&n);
for(i=0;i<1000;i++)
a[i]=i+1;
for(i=0;i<n;i++)
{
scanf("%d %d",&ai,&bi);
k=0;
for(j=0;j<s;j++)
if(a[j]%ai==bi)
{
a[k]=a[j];
k++;
}
s=k;
}
if(k!=0)
printf("%d",a[0]);
return 0;
}

最大乘积的整数的拆分

题目描述:
将一个整数N分解成各不相同的加数的和,使这些加数的乘积最大。N范围为[5,1000]
提示:从乘积最大的原则出发:多拆3,少拆2,不拆1,1对乘法没有贡献。如6拆为3+3>3+2+1;4拆分为2+2>3+1,因此,拆分的最大数为3.
输入描述:
输入一个整数N(5<=N<=1000)
输出描述描述:
能够使得积最大的加数序列,序列按拆分数由小到大的顺序排列,每个数字之间有一个空格,最后一个数字没有空格。
样式输入:

7

样式输出:

2 2 3

源代码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
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n%3==1)
{
printf("2 2");
n-=4;
while(n)
{
printf(" 3");
n-=3;
}
//printf("4");
}
else if(n%3==2)
{
printf("2");
n-=2;
while(n)
{
printf(" 3");
n-=3;
}
}
else
{
printf("3");
n-=3;
while(n)
{
printf(" 3");
n-=3;
}
}
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
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
if(n%3==1)//余数为一的最后拆成2和2,其余拆成3.
{
printf("2 2");
while(n!=4)
{
n-=3;
printf(" 3");
}

}
else if(n%3==2)//余数为二的拆一个2,其余为3.
{
printf("2");
while(n!=2)
{
n-=3;
printf(" 3");
}

}
else//为0的均为3.
{
while(n!=3)
{
n-=3;
printf("3 ");
}
printf("3");
}
return 0;
}

插队—数的插入

题目描述:
编写程序,对一个已经排好序的数组,输入一个元素。将该元素按原来的排序规则将它插入到数组中。
例如原数组为:1 2 6 7 9,输入待插入的元素3,则插入完成后结果为:1 2 3 6 7 9;
输入描述:
输入包含两部分,第一部分先输入n(2<n<=100),表示数组中元素个数,接着输入n个已经排序好的数,第二部分为待插入的数据
输出描述描述:
新的排序好的数组元素,数组元素之间用一个空格分隔,最后一个元素后不要空格。
样式输入:

5
1 2 6 7 9
3

样式输出:

1 2 3 6 7 9

源代码

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 a[101],n,i,j;
int s,temp;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&s);
for(i=0;i<n;i++)
{
if(a[i]>s)
{
for(j=n;j>i;j--)
a[j]=a[j-1];
a[i]=s;
break;
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("%d",a[n]);
return 0;
}

卫星定位—数的查找

题目描述:
编写程序,对一个已经排好序的数组,输入一个元素。将该元素在数组中的位置索引出来(折半查找)。
例如原数组为:1 2 6 7 9,输入待查找的元素7,则查找结果为4,如果没有找到该元素,则输出数值-1;

输入描述:
输入包含两部分,第一部分先输入n,表示数组中元素数,接着输入n个已经排序好的数,数组最大个数n为20,第二部分为待查找的数据
输出描述描述:
待查找的元素位置
样式输入:

5
1 2 6 7 9
7

样式输出:

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
27
#include<stdio.h>
int main()
{
int n,k,a[20];
int i,low,top,mid,loc=-1;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
low=0;
top=n-1;
while(low<top)
{
mid=(low+top)/2;
if(a[mid]>k)
top=mid-1;
else if(a[mid]<k)
low=mid;
else
{
loc=mid+1;
break;
}
}
printf("%d",loc);
return 0;
}

警察抓贼—数的删除

题目描述:
编写程序,将n(n<1000)个元素中的某个特定元素删除。如果该元素出现的次数t为奇数次,则删除第(t+1)/2那个,如果出现的次数t为偶数次,则删除第(t/2)个
输入描述:
输入包含两部分,第一部分先输入n,接着输入n个原数据。第二部分为待删除的元素;
输出描述描述:
删除特定元素后的剩余元素,如果没有元素被删除,则原样输出;元素之间用一个空格分隔,最后一个元素没有回车。
样式输入:

8
1 3 4 6 3 5 3 6
3

样式输出:

1 3 4 6 5 3 6

源代码

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
#include<stdio.h>
int main()
{
int n,a[1000];
int s,i,t=0,m,j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&s);
for(i=0;i<n;i++)
if(a[i]==s)
t++;
if(t%2!=0)
m=(t+1)/2;
else
m=t/2;
for(i=0;i<n-1;i++)
{
if(a[i]!=s)
printf("%d ",a[i]);
else
{
j++;
if(j!=m)
printf("%d ",a[i]);
}
}
if(a[n-1]!=s)
printf("%d",a[n-1]);
else
{
j++;
if(j!=m)
printf("%d",a[n-1]);
}
return 0;
}

是非黑白—字符串比较

题目描述:
编写函数实现两个等长字符串大小比较(两字符串长度<81)。比较规则如下:字符大小按对应的ASCII 码值,字符串大小比较时按对应字符比较,如果比较的两字符不等,则说明存在大小关系,停止比较操作。如果相等,则比较下一次字符,直到最后一个。如果第一个字符串小于第二个字符串则输出第二个字符串,如果大于则输出第一个字符串(字符串输出含回车),如果相等则返回数值0(不含回车);要求不使用cmpstr()函数完成;
输入描述:
输入待比较的两个字符串
输出描述描述:
字符串比较结果
样式输入:

abcdefg
abcdeff

样式输出:

abcdefg

源代码

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
#include<stdio.h>
#include<string.h>
int main()
{
char a[81],b[81];
int i,len1,len2,max,s1=0,s2=0;
scanf("%s",a);
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
max=(len1>len2)?len1:len2;
for(i=0;i<len2;i++)
{
if(a[i]<b[i])
{
s2++;
break;
}
if(a[i]>b[i])
{
s1++;
break;
}
}
if(s1==1)
puts(a);
if(s2==1)
puts(b);
if(s1==0 && s2==0)
{
if(len1>len2)
puts(a);
else if(len1<len2)
puts(b);
else
printf("0");
}
return 0;
}

搭桥—字符串连接

题目描述:
编写函数将两个升序排列的字符串(串长<81)融合成一个字符串,融合后的字符串仍然是升序排列的。

输入描述:
输入两升序字符串
输出描述:
融合后的字符串 (含回车符)
样式输入:

acefi
bdfg

样式输出:

abcdeffgi

源代码

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>
#include<string.h>
int main()
{
char a[162],b[81];
int i,j,len,temp;
scanf("%s",a);
scanf("%s",b);
strcat(a,b);
len=strlen(a);
for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
puts(a);
return 0;
}

一清二楚—字符串统计

题目描述:
输入一字符串,该字符串包含字母、数字和其他字符。统计该字符串中数字、字母和其他字符出现的频率。(注意,其他字符包含空格)
输入描述:
一混合字符串,最大长度为200
输出描述描述:
各类字符出现频率,最后一行不含回车。
样式输入:

abcdefg9999////

样式输出:

ch:7
num:4
other:4

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<string.h>
main()
{
1: char a[201];
int ch=0,num=0,other=0,i,k;
gets(a);
k=strlen(a);
for(i=0;i<k;i++)
{
if((a[i]>='A'&&a[i]<='Z')||(a[i]>='a'&&a[i]<='z'))
ch++;
else if(a[i]>='0'&&a[i]<='9')
num++;
else
other++;
}
printf("ch:%d\nnum:%d\nother:%d",ch,num,other);
}

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<string.h>
int main()
{
char a[200];
int ch=0,num=0,other=0,len,i;
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]>='0' && a[i]<='9')
num++;
else if((a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z'))
ch++;
else
other++;
}
printf("ch:%d\nnum:%d\nother:%d",ch,num,other);
return 0;
}

克隆—字符串的拷贝(胡宁静)

题目描述:
编写程序实现字符串拷贝,输入两字符串(字符串长度小于100),将第一个字符串拷贝到第二个字符串中;如果第一个字符串的长度a小于第二个字符串长度b,则第二个字符串的长度也将缩减至第一个的长度a,如果第一个字符串的长度a大于或等于第二个长度b,则只将a的前b个字符拷贝到第二个中;
输入描述:
输入两字符串
输出描述描述:
输出第二个字符串,注意:输出含回车。
样式输入:

Abdfeg
Bdfad

样式输出:

Abdfe

源代码

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>
#include<string.h>
int main()
{
char a[100],b[100];
int len1,len2,i;
scanf("%s %s",a,b);
len1=strlen(a);
len2=strlen(b);
if(len1<len2)
{
for(i=0;i<len1;i++)
b[i]=a[i];
b[len1]='\0';
}
else
{
for(i=0;i<len2;i++)
b[i]=a[i];
}
puts(b);
return 0;

}

2:源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<string.h>
int main()
{
int len1,len2,i;
char a[100],b[100];
gets(a);
gets(b);
len1=strlen(a);
len2=strlen(b);
if(len1<len2)
for(i=0;i<len1;i++)
printf("%c",a[i]);
else
{
for(i=0;i<len2;i++)
printf("%c",a[i]);
}
return 0;
}

字母转换

题目描述:
输入一个字符串(长度<100),将其中所有大写字母改为小写字母,而所有小写字母全部改为大写字母,其余字符原样输出然后输出前n个字符。
设计步骤
①输入字符串;
②用循环判断字符串中的每个字符是大写还是小写,若是大写要转换成小写,是小写要转换成大写:大写与小写字母的转换关系是“小写字母=大写字母+32”
③用printf输出该字符串前n个字符。
输入描述:
输入数据为1个数字,表示输出字符窜长度(n<100),接着输入1个字符串,其长度不限,可包含键盘上可见的所有字符
输出描述描述:
输出为1个字符串,根据输入数据,将其中的大写字符转换成小写,小写转换成大写,其余字符不变
样式输入:

5
FG56hj

样式输出:

fg56H

源代码

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 n,i;
char a[100];
scanf("%d",&n);
getchar();
gets(a);
for(i=0;i<n;i++)
{
if(a[i]<='z' && a[i]>='a')
printf("%c",a[i]-32);
else if(a[i]<='Z' && a[i]>='A')
printf("%c",a[i]+32);
else
printf("%c",a[i]);
}
return 0;
}

数字转换

题目描述:
输入一个数字,大小<100000,将其中每位数字进行转换后输出,规则如下:
数字0与9互换、1与8互换、2与7互换、3与6互换、4与5互换。
注意:要考虑首位数字为9时的转换结果。
输入描述:
输入数据为1个数字,大小<100000
输出描述描述:
输出为1个根据转换规则转换完成后的数字
样式输入:

56789

样式输出:

43210

源代码

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
52
53
#include<stdio.h>
#include<string.h>
int main()
{
char a[6];
int i,len;
scanf("%s",a);
len=strlen(a);
if(a[0]!='9')
{
if(a[0]=='1')
printf("8");
if(a[0]=='2')
printf("7");
if(a[0]=='3')
printf("6");
if(a[0]=='4')
printf("5");
if(a[0]=='5')
printf("4");
if(a[0]=='6')
printf("3");
if(a[0]=='7')
printf("2");
if(a[0]=='8')
printf("1");
}
for(i=1;i<len;i++)
{
if(a[i]=='0')
printf("9");
if(a[i]=='1')
printf("8");
if(a[i]=='2')
printf("7");
if(a[i]=='3')
printf("6");
if(a[i]=='4')
printf("5");
if(a[i]=='5')
printf("4");
if(a[i]=='6')
printf("3");
if(a[i]=='7')
printf("2");
if(a[i]=='8')
printf("1");
if(a[i]=='9')
printf("0");
}
return 0;

}

函数求解1/n的累乘

题目描述:
利用自定义函数编写程序,求下面的式子:
Y=11/21/3……*1/n (n的数值由键盘输入,n<=10)

输入描述:
输入一个正整数

输出描述描述:
输出为小数,保留小数点后12位有效数字。
样式输入:

3

样式输出:

0.166666666667

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main()
{
int n,i;
double s,y=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s=i;
y*=1/s;
}
printf("%.12lf",y);
return 0;
}

函数求解1/n的累减(谌海军)

题目描述:
利用自定义函数编写程序,求下面的式子:
Y=1-1/2-1/3……-1/n (n的数值由键盘输入,n<=100)
输入描述:
输入一个正整数
输出描述描述:
输出为小数,保留小数点后8位有效数字。
样式输入:

8

样式输出:

-0.71785714

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main()
{
int n,i;
double s,y=1;
scanf("%d",&n);
for(i=2;i<=n;i++)
{
s=i;
y-=1/s;
}
printf("%.8lf",y);
return 0;
}

换汽水

题目描述:
1块钱1瓶汽水,3个空汽水瓶换1瓶汽水。n块钱能喝几瓶汽水?
输入描述:
输入为一个正整数n(1<=n<=100),表示钱数。
输出描述描述:
输出为一个正整数,表示可喝汽水的瓶数。
样式输入:

10

样式输出:

15

源代码

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>
int main()
{
int n,sum,s;
scanf("%d",&n);
sum=n;
while(n)
{
if(n==2)
{
sum+=1;
break;
}
if(n<2)
break;
s=n/3;
sum+=s;
n=n%3+s;
}
printf("%d",sum);
return 0;
}

聪明的顾客

题目描述:
1瓶汽水卖1块钱,顾客还可以用3个空汽水瓶换1瓶汽水喝。请问聪明的顾客最少可以花多少钱买到n瓶汽水喝?
说明:当顾客手中有两个空汽水瓶的时候,如果店家剩余1瓶以上,可以选择先借用1瓶汽水,喝完后连同手里先前已有的两个空汽水瓶还给店家即可。
输入描述:
输入为一个正整数n(1<=n<=100),表示可卖汽水瓶数。
输出描述描述:
输出为一个正整数,表示所花钱数。
样式输入:

10

样式输出:

7

源代码

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
#include<stdio.h>
int main()
{
int n,sum,s,i,k,a[70]={0,1};
scanf("%d",&n);
for(i=2;i<70;i++)
{
k=i;
sum=i;
while(i)
{
if(i==2)
{
sum+=1;
break;
}
if(i<2)
break;
s=i/3;
sum+=s;
i=i%3+s;
}
i=k;
a[i]=sum;
}
for(i=0;i<70;i++)
if(a[i]==n)
{
printf("%d",i);
break;
}
return 0;
}

字符串起始位置

题目描述:
有字符串a(长度<=100),b(长度<=10),计算b串在a串中首次出现的位置。
输入描述:
输入为两个字符串,第一个字符串长度小于100,第二个字符串长度小于10;
输出描述描述:
若b串在a串中出现,输出为一个正整数,表示b串在a串中首次出现的位置,若b串未出现在a串中,则输出0;
样式输入:

abcdefghijklmnababcdeabc
abc

样式输出:

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
#include<stdio.h>
#include<string.h>
int main()
{
int len1,len2,i,j,sum=0,n=0,k;
char a[100],b[10];
scanf("%s",a);
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
for(i=0;i<len1;i++)
{
k=i;//用来恢复i的值。
for(j=0;j<len2;j++)
{
if(a[i]==b[j])
sum++;//如果相等则加一。
else break;
i++;//i要同时加,保持对应比较。
}
i=k;
if(sum==len2)
{
printf("%d",i+1);
n++;//用来记录是否有位置存在。
break;//有一个位置存在则跳出。
}
sum=0;
}
if(n==0)
printf("0");
return 0;
}

字符串清理

题目描述:
假定输入的字符串中只包含字母和号。请编写函数fun,它的功能是:将字符串尾部的号全部删除,前面和中间的*号不删除。
输入描述:
输入为一个字符串,字符串长度小于100;

输出描述描述:
输出为清理后的字符串;

样式输入:

ABCDEFG

样式输出:

*ABC*DEFG

源代码

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>
#include<string.h>
fun(char a[])
{
int len,i,s;
len=strlen(a);
for(i=len-1;i>=0;i--)
if(a[i]!='*')
{
a[i+1]='\0';
break;
}
}
int main()
{
char a[100];
int i,len;
scanf("%s",a);
fun(a);
len=strlen(a);
for(i=0;i<len;i++)
printf("%c",a[i]);
return 0;
}

围圈报数游戏

题目描述:
有n(n<=100)围成一圈,顺序排号(从1排到n)。
从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,此时报数顺序调转,如:11个人围成1圈,从1报到4时,原来4号位的人退出,此时调转顺序报数,原来3号位的人报数1,原来2号位的人报数2,原来1号位的人报数1,原来11号位的人报数4,此时11号位的人退出游戏,再次逆转顺序报数,以此类推,问最后留下的是原来第几号的那位?
输入描述:
输入为两个正整数,第一个<=100,第二个<=9;
输出描述:
输出为一个正整数;
样式输入:

11 4

样式输出:

3

源代码

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
52
53
#include<stdio.h>
int main()
{
int n,m,i,j,k1=0,k2=0,z1,sum1,sum2,a[101];
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
a[i]=1;
sum1=n;
z1=1;
sum2=0;
while(sum1!=1)
{
for(i=z1;i<=n;i++)
{
if(a[i]!=0)
{
k1++;
if(k1==m)
{
a[i]=0;
sum1--;
if(sum1==1)
break;
while(sum2==0)
{
for(j=i-1;j>0;j--)
if(a[j]!=0)
{
k2++;
if(k2==m)
{
a[j]=0;
sum2++;
sum1--;
k2=0;
break;
}
}
i=n+1;
}
z1=j;
k1=0;
sum2=0;
}
}
}
z1=1;
}
for(i=1;i<=n;i++)
if(a[i]!=0)
printf("%d",i);
return 0;
}

报数游戏

题目描述:
有n(n<=100)围成一圈,顺序排号(从1排到n)。从第一个人开始报数(从1一直往上报数),凡报到m及m的倍数或者尾数为m的人退出圈子,问最后留下的是原来第几号的那位?
输入描述:
输入为两个正整数,第一个<=100,第二个<=9;
输出描述:
输出为一个正整数;
样式输入:

10 3

样式输出:

5

源代码

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 n,m,i,sum,a[101],k=0;
scanf("%d%d",&n,&m);
sum=n;
for(i=1;i<=n;i++)
a[i]=1;
while(sum!=1)
for(i=1;i<=n;i++)
if(a[i]!=0)
{
k++;
if(k%m==0)
{
a[i]=0;
sum--;
}
}
for(i=1;i<=n;i++)
if(a[i]!=0)
printf("%d",i);
return 0;
}

整数各位取偶数

题目描述:
将一个整数中的每一位上为偶数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为:87653142时,t中的数为:8642。
(知识点:控制语句、函数、指针)
输入描述:
输入数据为一个不大于100000000的整形数;
输出描述描述:
输出数据为一个不大于100000000的整形数;
样式输入:

987654321

样式输出:

8642

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
int main()
{
int s,i,k=0;
int a[100];
scanf("%d",&s);
while(s)
{
if((s%10)%2==0)
a[k++]=s%10;
s/=10;
}
for(i=k-1;i>=0;i--)
printf("%d",a[i]);
return 0;
}

五位反序数

题目描述:
设N是一个五位数,它的n倍恰好是其反序数(例如:123的反序数是321),
编程,输出一个满足条件的N。(知识点:控制语句)
输入描述:
输入为一个整形数n(2<=n<=9)
输出描述描述:
输出为一个五位数的整形数
样式输入:

9

样式输出:

10989

源代码

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>
int fan(int n)
{
int law=0,b;
while(n>0)
{
b=n%10;
law=law*10+b;
n/=10;
}
return law;
}
void main()
{
int n,N;
scanf("%d",&n);
for(N=10000;N<100000;N++)
if(N*n==fan(N))
{
printf("%d",N);
break;
}
}

复制字符串

题目描述:
有一个字符串,包括n个字符。写一个函数,将此字符串从第a个字符开始的b个字符复制成另一个字符串。
要求在主函数输入字符串及a,b的值并输出复制结果。
(知识点:控制语句、字符串、指针)

输入描述:输入为一个字符串(长度小于80)及两个整形数(a+b小于字符串的实际长度)
输出描述:
输出为一个字符串
样式输入:

abcdefghijklmnopqrst
8 5

样式输出:

hijkl

源代码

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
#include<string.h>
void main()
{
char a[80],b[80]={0};
int i,x,y,j;
gets(a);
scanf("%d %d",&x,&y);
for(i=x-1,j=1;j<=y;j++,i++)
b[j-1]=a[i];
puts(b);
}

增加的兔子

题目描述:
古典问题,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问一年之内每个月的兔子总数为多少?
输入描述:

输出描述描述:
输出一年之中每个月的兔子总数。
样式输入:

样式输出:

1 1 2 3 5 8 13 21 34 55 89 144

源代码

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main()
{
int a[12]={1,1},i;
for(i=2;i<12;i++)
a[i]=a[i-1]+a[i-2];
for(i=0;i<11;i++)
printf("%d ",a[i]);
printf("%d",a[11]);
return 0;
}

整数的分解

题目描述:
将一个正整数分解质因数。例如:输入90,打印出90=233*5。
输入描述:
输入一个正整数。
输出描述描述:
等式左边输出整数,等式右边整数相乘形式。

样式输入:

90

样式输出:

90=2x3x3x5

源代码

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
#include<stdio.h>
int main()
{
int a[50],i=2,j,n,sum=0,k=0,b[50]={0},z;
while(k!=50)
{
for(j=1;j<=i;j++)
if(i%j==0)
sum++;
if(sum==2)
{
a[k]=i;
k++;
}
sum=0;
i++;
}
scanf("%d",&n);
k=0;
z=n;
while(n!=1)
{
for(i=0;i<50;i++)
if(n%a[i]==0)
{
n=n/a[i];
b[k]=a[i];
k++;
break;
}
}
printf("%d=",z);
for(i=0;i<k-1;i++)
printf("%d*",b[i]);
printf("%d",b[k-1]);
return 0;
}

小球自由落体问题

题目描述:
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
输入描述:

输出描述描述:
小球在第10次落地时经过的路程数sn和第10次反弹的高度hn。
样式输入:

样式输出:

the total of road is 299.609375
the tenth is 0.097656 meter

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main()
{
int i;
double sn,a[11]={100};
sn=100;
for(i=2;i<=10;i++)
{
a[i-1]=a[i-2]/2.0;
sn+=2*a[i-1];
}
a[10]=a[9]/2.0;
printf("the total of road is %lf\n",sn);
printf("the tenth is %lf meter",a[10]);
return 0;
}

统计字符

题目描述:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
输入描述:
输入包含英文字母、空格、数字和其他字符的字符串
输出描述:
输出英文字母,空格,数字和其他字符的个数
样式输入:

avc i2g3 &*#4

样式输出:

5,2,3,3
源代码

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<string.h>
int main()
{
char a[100];
int len,i,s1=0,s2=0,s3=0,s4=0;
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z'))
s1++;
else if(a[i]==' ')
s2++;
else if(a[i]<='9' && a[i]>='0')
s3++;
else
s4++;
}
printf("%d,%d,%d,%d",s1,s2,s3,s4);
return 0;
}

数a求和

题目描述:
求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制输入。
输入描述:
输入基数a和需要相加的个数n
输出描述描述:
输出相加的结果,注意结果最后不需要回车换行。
样式输入:

2 5

样式输出:

24690

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
int i,j,n,a,s,z,w;
scanf("%d%d",&a,&n);
for(s=0,i=1;i<=n;i++)
{
for(j=1,w=1,z=0;j<=i;j++)
{
z+=a*w;
w*=10;
}
s+=z;
}
printf("%d",s);
return 0;
}

统计单词个数

题目描述:
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。例如,输入:I am a boy,里面包含了四个英文单词。
输入描述:
利用gets输入字符。
输出描述描述:
输出单词个数,程序最后不需要回车换行。
样式输入:

I am a boy

样式输出:

There are 4 words in the line

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<string.h>
int main()
{
char a[100];
int len,i,b[26]={0},sum=1;
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]==' ')
sum++;
}
printf("There are %d words in the line",sum);
return 0;
}

三角形求最大和的问题

题目描述:
如图所示是一个由数字组成的三角形,编写程序按照某条路线遍历从第一行的首数字到最后一行的某个数,使每一行经过的数字相加的和为最大值,每一次跳转可以向左下方或者右下方进行。例如样图中第一行为7,选择左下方的数字3的话,继续选择左下方的数字8,第四行选择右下方的7,最后到达左下方的数字5。这样,7+3+8+7+5=30为最大。

    7
  3   8
8   1   0

2 7 4 4
4 5 2 6 5
输入描述:
先由键盘输入三角形的行数N(1<N<=100),接下来输入每行的数字,数字取值范围为0~99。
输出描述描述:
输出计算出的数字相加和的最大值。
样式输入:

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样式输出:

30

源代码

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>
int main()
{
int a[100][100],i,j,n,max=0;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
scanf("%d",&a[i][j]);
a[1][0]+=a[0][0];
a[1][1]+=a[0][0];
for(i=2;i<n;i++)
{
a[i][0]+=a[i-1][0];
for(j=1;j<i;j++)
a[i][j]+=(a[i-1][j-1]>a[i-1][j])?a[i-1][j-1]:a[i-1][j];
a[i][j]+=a[i-1][j-1];
}
for(i=0;i<n;i++)
if(a[n-1][i]>max)
max=a[n-1][i];
printf("%d",max);
return 0;
}

节约字节

题目描述:
John在做一个项目,项目对存储容量有着近乎苛刻的要求,为此John需要对一些东西进行压缩存储。John的第一个问题就是一大堆的字符串,存储它们太占地方了,为此他想了一个办法:如果字符串具有相同的后缀,那么就把这么字符串的相同后缀和在一起,这样就能节约一点空间了。比如说有三个字符串分别为”john”、”ajohn”和”bjohn”,这样它们有相同的后缀”john”,这时候只需存储一个后缀”john”,节省了8个字母的存储空间。请编写程序计算对于不同的字符串能节省的存储空间?
输入描述:
第一行是一个整数k,表示可以输入多少个测试用例.每个测试用例占n+1行即每个测试用例的第一行为一个整数n(1<=n<=20),从第二行开始依次为n个字符串,字符串由英文字母组成,大小写敏感。
输出描述
一个测试用例输出完毕之后,换行输出这个测试用例节省了多少存储空间。
样式输入

1
3
john
ajohn
bjohn

样式输出:

save 8 characters

源代码

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
#include<stdio.h>
#include<string.h>
int main()
{
int a[20]={0},i,n,k,j,z,m,t,len[20],min;
char s[20][100];
scanf("%d",&k);
while(k)
{
i=0;
scanf("%d",&n);
z=n;
while(z)
{
scanf("%s",s[i]);
i++;
z--;
}
for(i=0;i<n;i++)
len[i]=strlen(s[i]);
for(j=1;j<n;j++)
{
m=len[0]-1;
t=len[j]-1;
while(j)
{
if(s[0][m]==s[j][t])
a[j]++;
else
break;
m--;
t--;
if(m<0||t<0)
break;
}
}
min=a[1];
for(i=2;i<n;i++)
if(min>a[i])
min=a[i];
min*=n-1;
printf("save %d characters\n",min);
k--;
for(i=1;i<n;i++)
a[i]=0;
}
return 0;
}

猴子吃桃问题

题目描述
猴子第一天摘下若干桃子,吃了一半,还不过瘾,又多吃了一个。第二天吃掉剩下桃子的一半,又多吃了一个。以此类推,到第10天时,就只有一个桃子了。问猴子第一天摘下了多少桃子?
输入描述:

输出描述描述:
猴子摘下桃子的总数,注意程序最后不需要回车换行。
样式输入:

样式输出:

1534

源代码

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
int i,sum=1;
for(i=1;i<10;i++)
sum=(sum+1)*2;
printf("%d",sum);
return 0;
}

2源代码

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main()
{
int n,i,sum=1;
scanf("%d",&n);
for(i=1;i<n;i++)
sum=(sum+1)*2;
printf("%d",sum);
return 0;
}

更多

更多题库链接,
+