注意:现在偷的懒以后都要补回来的!
希望大家认真学好数据结构,不希望后悔!
- 阶乘求和
【问题描述】求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。(注:有多个测试数据)
【输入形式】n
【输出形式】Sn的值
【样例输入】5
【样例输出】153
【样例说明】
有多组测试数据,可以连续输出结果。
#include
int main()
{
long long n,sum=0,a=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
a*=j;
}
sum+=a;
a=1;
}
printf("%lld",sum);
return 0;
}
- 字符统计
【问题描述】输入字符串,统计字符串中字母(包括大小写)、空格的个数。
【输入形式】字符串(包括字母、空格、数字和其他字符)
【输出形式】字母个数 空格个数
【样例输入】%4dB *hg #
【样例输出】4 2
【样例说明】
输入字符串以换行符为结束。测试数据有多组。
#include
int main()
{
int n=0,sum=0,i=0;
char ch[1000];
gets(ch);
while (ch[i] != '\0'){
if ((ch[i]>='A' && ch[i]<'Z') || (ch[i]>='a' && ch[i]<'z')){
sum++;
}
if (ch[i]==' '){
n++;
}
i++;
}
printf("%d %d",sum,n);
return 0;
}
- 结构体练习1
【问题描述】
录入 n 个学生的成绩,并查询。
【输入形式】
第一行输入包括 n、 m(1<=n<=5000,1<=m<=10,000)两个数字。
接下来 n 行,每行包含学号和成绩,学号用整数表示;成绩为不超过 100 的非负整数。
接下来 m 行,每行包括一个学号。
【输出形式】
输出 m 行,如果查询的学生不存在,输出”not exist!”,否则输出学生的成绩。
【样例输入】
5 3
1 95
2 34
3 89
4 65
5 90
2
5
8
【样例输出】
34
90
not exist!
【样例说明】
【评分标准】
数据存储采用结构体。
#include
typedef struct sc{
int sno;
int score;
}sc;
int main()
{
int n,m;
scanf("%d %d",&n,&m);
sc a[n];
int b[m];
for(int i=0;i<n;i++){
scanf("%d %d",&a[i].sno,&a[i].score);
}
for(int i=0;i<m;i++){
scanf("%d",&b[i]);
}
int flag=0;
for (int j = 0; j < m; j++){
for(int i=0;i<n;i++){
if(a[i].sno==b[j]){
printf("%d\n",a[i].score);
flag=0;
break;
}else{
flag=1;
}
}
if(flag){
printf("not exist!\n");
}
flag=0;
}
return 0;
}
- 结构体练习2
【问题描述】
录入 n 个学生的成绩,并查询。
【输入形式】
第一行输入包括 n、 m(1<=n<=5000,1<=m<=10,000)两个数字。
接下来 n 行,每行包含姓名和成绩,姓名用字符串表示(全大写字母,长度不超过10);成绩为不超过 100 的非负整数。
接下来 m 行,每行包括一个姓名。
【输出形式】
输出 m 行,如果查询的学生不存在,输出”not exist!”,否则输出学生的成绩。
【样例输入】
5 3
TOM 95
ROBERT 34
ALICE 89
WEWI 65
GRACE 90
ROBERT
GRACE
POPO
【样例输出】
34
90
not exist!
【样例说明】
【评分标准】
数据存储采用结构体。
#include
#include
typedef struct sc{
char name[11];
int score;
}sc;
int main()
{
int n,m;
scanf("%d %d",&n,&m);
sc a[n];
char b[m][11];
for(int i=0;i<n;i++){
scanf("%s %d",a[i].name,&a[i].score);
}
for(int i=0;i<m;i++){
scanf("%s",b[i]);
}
int flag=0;
for (int j = 0; j < m; j++){
for(int i=0;i<n;i++){
if(strcmp(a[i].name,b[j])==0){
printf("%d\n",a[i].score);
flag=0;
break;
}else{
flag=1;
}
}
if(flag){
printf("not exist!\n");
}
flag=0;
}
return 0;
}
- 最大子列和问题
【问题描述】给定整数a1,a2,a3,…an(可能有负数),求子列和的最大值(如果所有整数均为负数,则最大子列和为0)。
【输入形式】第一行输入n,为整数个数,第二行输入n个整数(可以有负数)。
【输出形式】输出最大子列和。
【样例输入】
10
-9 10 -11 8 -7 9 7 -4 8 -7
【样例输出】
21
【样例说明】
请大家分别用不同的方法完成此题并注释说明。
#include
int main()
{
int n,m,count=0,index,p=0;
scanf("%d",&n);
int b[n];
for(int i=0;i<n;i++){
scanf("%d",&b[i]);
}
for(int i=0;i<n;i++){
if (b[i]>0){
index=i;
break;
}else if(i+1==n){
printf("0");
return 0;
}
}
int max;
for (int i = index; i < n; i++){
int sum=0;
for(int j=i;j<n;j++){
sum+=b[j];
if (max<sum){
max=sum;
}
}
}
printf("%d",max);
return 0;
}
程序片段
- 最大公约数与最小公倍数
【问题描述】写两个函数,分别求两个正整数的最大公约数和最小公倍数,主函数调用这两个函数,并输出结果。两个正整数(a,b<100)由键盘输入。
【输入形式】两个正整数(以空格分隔)
【输出形式】最大公约数 最小公倍数(以空格分隔)
【样例输入】6 15
【样例输出】3 30
#include
int gcd(int n,int m){
int a=1,b,c;
while (a){
a=n%m;
n=m;
m=a;
}
return n;
}
int lcm(int n,int m){
return n*m/gcd(n,m);
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
if (m>n){
int a=m;
m=n;
n=a;
}
printf("%d %d",gcd(n,m),lcm(n,m));
return 0;
}