目录
- 函数题
- 求两个形参的乘积和商
- 统计专业人数
- 字符串指定位置插入
- 求字符串中整数字符之和
- 编程题
- 这是一道计算题
- 买复印纸(误差)
- 求给定数组元素的最大值
- 统计数字字符
- 分段函数求值
- 逆序的三位数
- 三天打鱼两天晒网
- 计算天数
- 输出个等腰梯形吧
- 幸运数字
- 学生的平均成绩
- 找最长的字符串
函数题
求两个形参的乘积和商
给定函数 fun 的功能是:求两个形参的乘积和商,并通过形参返回调用程序。
函数接口定义:
void fun ( double a, double b, double *x, double *y );
其中 a
、 b
、x
、y
都是用户传入的参数。函数求 a
和 b
两个形参的乘积和商并通过形参 x
和 y
返回。
裁判测试程序样例:
#include <stdio.h>
void fun( double a, double b, double *x, double *y );
int main ( )
{
double a, b, c, d;
scanf ("%lf%lf", &a, &b );
fun ( a , b, &c, &d ) ;
printf ("c=%.2f d=%.2f\n", c, d );
return 0;
}
/* 请在这里填写答案 */
输入样例:
61.82 12.65
输出样例:
c=782.02 d=4.89
void fun ( double a, double b, double *x, double *y ){
*x=a*b;
*y=a/b;
}
统计专业人数
本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:
struct ListNode {
char code[8];
struct ListNode *next;
};
这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02。
函数接口定义:
int countcs( struct ListNode *head );
其中head
是用户传入的学生学号链表的头指针;函数countcs
统计并返回head
链表中专业为计算机的学生人数。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ListNode {
char code[8];
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
int countcs( struct ListNode *head );
int main()
{
struct ListNode *head;
head = createlist();
printf("%d\n", countcs(head));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1021202
2022310
8102134
1030912
3110203
4021205
#
输出样例:
3
// 第2、3位是专业编号。计算机专业的编号为02。
// 对应索引为1、2
int countcs( struct ListNode *head ){
int count =0;
struct ListNode* cur=head;
while(cur){
if(cur->code[1]=='0' &&cur->code[2]=='2')
{
// printf("%c %c\n",cur->code[1],cur->code[2]);
count++;
}
cur=cur->next;
}
return count;
}
字符串指定位置插入
设计函数insert
,用指针实现在字符串s1中的指定位置n处插入字符串s2。
函数接口定义:
char* insert(char* s1, char* s2, int n);
其中,s1和s2为两个待处理字符串。n为字符串插入位置。
裁判测试程序样例:
#include <stdio.h>
#include<stdlib.h>
#define Max 100
char* insert(char* s1, char* s2, int n);
int main()
{
char s1[Max],s2[Max];
int n;
scanf("%s", s1);
scanf("%s", s2);
scanf("%d", &n);
char* ss = insert(s1, s2, n);
printf("%s", ss);
return 0;
}
/* 请在这里填写答案 */
输入样例:
123456789
1234
7
输出样例:
1234567123489
// 返回s1
char* insert(char* s1, char* s2, int n){
// 提前将s1保存到temp数组中
char temp[109]={0};
int cnt=0;
for(int i=n;s1[i]!='\0';i++) temp[cnt++]=s1[i];
int start,i=0;
for(start=n,i=0;s2[i]!='\0';i++){
s1[start++]=s2[i];
}
// 将s1剩余字符接入s1
for(int i=0;temp[i]!='\0';i++) s1[start++]=temp[i];
s1[start]='\0';
return s1;
}
求字符串中整数字符之和
本题要求实现一个函数,计算一个字符串中整数字符之和。例如字符串“a2b3@7“中,整数数字字符有 2
,3
和7
,所以整数字符之和为 12
;例如字符串“xT345y28“中,整数数字字符有3
,4
,5
,2
和8
,所以整数字符之和为 22
。
函数接口定义:
int sumOfDigit (char *s );
s是指向一个字符串的指针。题目保证数字字符之和不超过int类型表示范围。题目保证字符串中不出现减号-,也就是说本题不用考虑负数。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
int sumOfDigit(char *s);
int main(void)
{
char s[30];
gets(s);
printf("%d", sumOfDigit(s));
return 0;
}
/* 请在这里填写答案 */
输入样例1:
a2b3@7
输出样例1:
12
输入样例2:
xT345y28
输出样例2:
22
输入样例3:
abcde
输出样例3:
0
int sumOfDigit (char *s ){
int ans=0;
for(int i=0;s[i]!='\0';i++){
if(s[i]>='0' && s[i]<='9') ans =ans+s[i]-'0';
}
return ans;
}
编程题
这是一道计算题
对于指定的整数N,计算a_3+a_4+a_5+…+a_n 的值,其中对于任意整数i,
有 a_i = i
输入格式:
输入一个整数N,输入时保证3<N<2.1∗10 ^9
输出格式:
输出一个整数,为计算结果。
输入样例:
5
输出样例:
12
样例解释
3+4+5=12,故输出12
#include <stdio.h>
long long sum=0;
int main()
{
long long n;
scanf("%lld",&n);
// for(int i=3;i<=n;i++) sum+=i;
sum=(3+n)*(n-2)/2;// 从3 开始少;两项
printf("%lld",sum);
return 0;
}
买复印纸(误差)
某办公室到年底准备将剩余的办公经费全部用于购买复印纸。请编写程序,输入办公经费的余额和每包复印纸的单价,计算并输出最多可购买多少包复印纸。
输入格式
办公经费余额和复印纸单价
输出格式
可购复印纸的最大数量
输入样例1
660.8 47.2
输出样例1
14
输入样例2
504.9 19.8
输出样例2
25
提示:注意实数的误差。浮点数在内存中是不精确的
// 版本1
#include<stdio.h>
int main()
{
double x,y;
int z;
scanf("%lf %lf",&x,&y);
z=x/y+0.000001;
printf("%d\n",z);
return 0;
}
// 版本2
#include <stdio.h>
#include <math.h>
int main()
{
double x,y;
double z;
scanf("%lf %lf",&x,&y);
z=x/y+0.000001;
printf("%.0f\n",floor(z));
return 0;
}
求给定数组元素的最大值
从键盘输入不超过50个非负整数,当输入为负值时,表示输入结束。试编程求出其中的最大值。
输入格式:
在一行中给出不超过50个非负整数(空格分隔),以负数结束。
输出格式:
按输出样例的形式输出其中的最大值,并输出,见样例。
输入样例:
9 0 62 36 15 28 -1
输出样例:
max=62
输入样例:
-1
输出样例:
NULL!
#include <stdio.h>
int main()
{
int x;
int max=0;
while(scanf("%d",&x) && x>=0)
{
if(x>max) max=x;
}
if(max==0) printf("NULL!");// 只输入了-1
else printf("max=%d",max);
return 0;
}
统计数字字符
输入一串字符(中间无空格,字符串最长80),统计其中数字字符0-9各出现多少次,输出出现过的数字(每3个字母占一行)及其出现次数。
输入格式:
字符串
输出格式:
输出出现过的数字(每3个字母占一行)及其出现次数。
例如:
1:2次 3:1次
输入样例1:
12edRRde456123232
输出样例1:
1:2次 2:4次 3:2次
4:1次 5:1次 6:1次
输入样例2:
wewQQFTSerfgs
输出样例2:
10个数字字符都没出现过
#include <bits/stdc++.h>
using namespace std;
int a[10];
int main()
{
string s;getline(cin,s);
int flag=0;
int len=s.size();
for(int i=0;i<len;i++)
{
if(s[i]>='0' && s[i]<='9')
{
a[s[i]-'0']++;
flag=1;// 出现数字
}
}
if(flag)
{
int cnt=0;
for(int i=0;i<10;i++)
{
if(a[i])
{
cnt++;
if(cnt==3)
{
printf("%d:%d次 \n",i,a[i]);
cnt=0;
}
else
printf("%d:%d次 ",i,a[i]);
}
}
}
else
printf("10个数字字符都没出现过\n");
return 0;
}
分段函数求值
已知实数x和y的函数关系如下:
编程实现,要求输入x的值,计算并输出y的值(输出结果保留小数点后2位)。
输入格式:
输入一个实数x。
输出格式:
输出实数y的值,保留2位小数。
输入样例:
0.5
输出样例:
5.50
#include <stdio.h>
#include <math.h>
int main(){
double x;scanf("%lf",&x);
double y;
if(x<5) y=x+5;
else if(x>=5 && x<10){
y=pow(x,2)+0.3*x;
}
else
y=5*x-10;
printf("%.2f",y);
return 0;
}
逆序的三位数
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出按位逆序的数。
输入样例:
123
输出样例:
321
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
int a=n/100;
int b=n/10%10;
int c=n%10;
printf("%d",c*100+b*10+a);
return 0;
}
三天打鱼两天晒网
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
输入格式:
输入在一行中给出一个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
输入样例1:
103
输出样例1:
Fishing in day 103
输入样例2:
34
输出样例2:
Drying in day 34
#include <stdio.h>
// 3-打鱼 5-晒网 10
int main(){
int n;scanf("%d",&n);
int temp=n%5;
if(temp>=1 && temp<=3)
printf("Fishing in day %d",n);
else if(temp>=4 && temp<=5 || temp==0)
printf("Drying in day %d",n);
return 0;
}
计算天数
本题要求编写程序计算某年某月某日是该年中的第几天。
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62
#include <stdio.h>
int main(){
int year,month,day;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
scanf("%d/%d/%d",&year,&month,&day);
// 判断闰年
if(year%4==0 && year%100!=0 || year%400==0) months[2]+=1;
int ans=0;
for(int i=1;i<month;i++) ans+=months[i];
ans+=day;
printf("%d",ans);
return 0;
}
输出个等腰梯形吧
小磊正在研究使用编程输出图形,今天小磊在研究使用特定字符(*符号)输出相应尺寸的等腰梯形。
由于梯形需要上底、下底的长度及位置,还有高度才能确定。所以现在小磊把这个问题简化了。
等腰梯形上底的长度固定为3个字符,然后根据高度H,再来确定下底的字符数。
输入格式:
输入一个正整数H代表梯形的高, 3<= H <= 100
输出格式:
输出等腰梯形,注意,等腰字符梯形的上底固定为3个字符,往下每一行,增加两个字符。
每一行最后一个字符后面直接回车换行,也就是等腰梯形的右侧不需要空格,详见样例。
输入样例:
5
输出样例:
***
*****
*******
*********
***********
//上底的长度固定为3个字符
#include <stdio.h>
// 3 5 7 9
int main(){
int h;scanf("%d",&h);
int start=3;
for(int i=0;i<h;i++){// 层数
// 打印空格h-1个并逐层递减
for(int j=0;j<h-1-i;j++) printf(" ");
// 打印*,逐层增加2个
for(int k=0;k<start;k++) printf("*");
start+=2;
printf("\n");
}
return 0;
}
幸运数字
越努力越幸运。这年诺诺读初三,3成为她的幸运数字,她光荣地加入了共青团。现在给你一串数字, 请找出其中的幸运数字(出现次数最多的那个数字,若有多个数字的出现次数都是最多,则为最大的那个数字)。
输入格式:
输入一串数字(长度不超过100)。
输出格式:
输出幸运数字。
输入样例:
320243315670920
输出样例:
3
#include <stdio.h>
#include <string.h>
// typedef struct Hash{
// char ch;
// int value;
// }H;
int hash[11];
int main(){
// H h[19];
char s[109];scanf("%s",s);
// printf("%s",s);
for(int i=0;s[i]!='\0';i++){
hash[s[i]-'0']+=1;
}
int i=0;
int ans=i,max=hash[i];
for(i=0;i<10;i++){
if(hash[i]>=max) {
max=hash[i];
ans=i;
}
}
// printf("%d %d\n",i,hash[i]);
printf("%d",ans);
return 0;
}
学生的平均成绩
有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),其中学号和姓名都是以字符串方式存储,计算出每名学生的平均成绩,
输入格式:
分别在5行中输入5名学生的信息。按照学号、姓名、3门课的成绩顺序输入,学号和姓名是均不超过4个字符的字符串,字符串中不包含空格、换行符和制表符,一名学生的各个数据之间用一个空格间隔。
输出格式:
分别在5行中输出5名学生的信息。按照学号、姓名、3门课的平均成绩顺序输出,其中学号和姓名输出占5列列宽,平均成绩保留1位小数,输出占5列列宽。
输入样例:
1 aa 78 45 12
2 bb 95 85 95
3 cc 75 45 65
4 dd 74 84 95
5 ee 48 49 56
输出样例:
1 aa 45.0
2 bb 91.7
3 cc 61.7
4 dd 84.3
5 ee 51.0
#include <stdio.h>
typedef struct Students{
int sno;
char name[5];
int score1;
int score2;
int score3;
double avg;
}Stu;
int main(){
Stu s[9];
for(int i=0;i<5;i++)
scanf("%d %s %d %d %d",&s[i].sno,s[i].name,&s[i].score1,&s[i].score2,&s[i].score3);
for(int i=0;i<5;i++) {
s[i].avg=(double)(s[i].score1+s[i].score2+s[i].score3)/3;
printf("%5d%5s%5.1f\n",s[i].sno,s[i].name,s[i].avg);
}
return 0;
}
找最长的字符串
本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最长的字符串:
The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。
输入样例:
5
li
wang
zhang
jin
xiang
输出样例:
The longest is: zhang
#include <stdio.h>
#include <string.h>
typedef struct String{
char str[89];
int length;
}Str;
int cmp(const void* e1,const void* e2){
Str* a=(Str*)e1;
Str* b=(Str*)e2;
return a->length < b->length;
}
int main(){
int n;scanf("%d",&n);
Str s_struct[1009];
for(int i=0;i<n;i++){
scanf("%s",s_struct[i].str);
int len=strlen(s_struct[i].str);
s_struct[i].length=len;
}
qsort(s_struct,n,sizeof(Str),cmp);
printf("The longest is: %s",s_struct[0].str);
return 0;
}