6-1 求一个四位数的各位数字的立方和 (6 分)
编写函数fun,函数的功能是:求一个四位数的各位数字的立方和。
函数接口定义:
int fun(int n);
其中 n是用户传入的参数。函数须返回 n 的各位数字的立方和。
裁判测试程序样例:
#include <stdio.h>
int fun(int n);
int main()
{
int k;
k=fun(1234);
printf("k=%d\n",k);
return 0;
}
/* 请在这里填写答案 */
输出样例:
k=100
int fun(int n){
int s = 0;
while(n!=0){
int k = n % 10;
s = s + k * k * k;
n/=10;
}
return s;
}
6-2 求主对角线元素的平方和 (6 分)
函数fun的功能是求一个3行3列主对角线元素的平方和。输入输出由主函数完成。
函数接口定义:
int fun(int a[3][3]);
其中 a 是用户传入的参数。函数须返回 a主对角线元素的平方和。
裁判测试程序样例:
#include <stdio.h>
int fun(int a[3][3]);
int main()
{
int i,j,s,a[3][3];;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
s=fun(a);
printf("Sum=%d\n",s);
return 0;
}
/* 请在这里填写答案 */
输入样例:
1 2 3 4 5 6 7 8 9
### 输出样例:
```out
Sum=107
作者: 王跃萍
单位: 东北石油大学
时间限制: 400 ms
内存限制: 64 MB
int fun(int a[3][3]){
int s = 0;
for(int i = 0; i < 3; i++){
s = s + a[i][i] * a[i][i];
}
// printf("### 输出样例:\n```out\n");
return s;
}
6-3 三整数排序(升序)* (6 分)
请编写函数,对三个整数进行排序。
函数原型
// 三整数排序(升序)
void IntSort3(int *x, int *y, int *z);
说明:参数 x、y 和 z 为指示三个整数的指针,函数值对这三个整数进行排序,使 x、y 和 z 所指变量值按由小到大的顺序排列。
裁判程序
#include <stdio.h>
// 交换整数
void IntSwap(int *x, int *y);
// 三整数排序
void IntSort3(int *x, int *y, int *z);
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
IntSort3(&a, &b, &c);
printf("%d %d %d\n", a, b, c);
return 0;
}
// 交换整数
void IntSwap(int *x, int *y)
{
...(略)...
}
/* 你提交的代码将被嵌在这里 */
输入样例
15 36 -27
输出样例
-27 15 36
要求:调用 IntSwap 函数交换两个整数的值。
void IntSort3(int *x, int *y, int *z){
if(*x>*y){
IntSwap(x,y);
}
if(*x>*z){
IntSwap(x,z);
}
if(*y>*z){
IntSwap(y,z);
}
}
由于没给出交换的函数具体内容 所以我写了 提交答案不用提交 如果有误请联系我改正
void IntSwap(int *x,int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
6-4 判断数字字符* (6 分)
C语言标准函数库中包括 isdigit 函数,用于判断数字字符。作为练习,我们自己编写一个功能与之相同的函数。
请编写函数,判断数字。
函数原型
// 判断数字
int IsDigit(char x);
说明:参数 x 是任意字符的 ASCII 码。若 x 是数字字符的 ASCII 码,则函数值为 1(真),否则为 0(假)。
裁判程序
#include <stdio.h>
// 判断数字
int IsDigit(char x);
int main()
{
char x;
scanf(" %c", &x);
if (IsDigit(x))
{
puts("Yes");
}
else
{
puts("No");
}
return 0;
}
/* 你提交的代码将被嵌在这里 */
输入样例1
8
输出样例1
Yes
输入样例2
W
输出样例2
No
int IsDigit(char x){
if(x-'0'>=0&&x-'0'<10){
return 1;
}
else
return 0;
}
6-5 使用函数的选择法排序 (10 分)
本题要求实现一个用选择法对整数数组进行简单排序的函数。
函数接口定义:
void sort( int a[], int n );
其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
void sort( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);
sort(a, n);
printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4
5 1 7 6
输出样例:
After sorted the array is: 1 5 6 7
选择忘记了 直接冒泡了
void sort( int a[], int n ){
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;
}
}
}
}
7-1 找出总分最高的学生 (7 分)
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
#include <stdio.h>
struct {
int num;
char name[20];
int a;
int b;
int c;
}stu[101];
int main(){
int n;
scanf("%d",&n);
for(int i = 0; i < n ;i++){
scanf("%d %s %d %d %d",&stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
}
int min = 0;
int t;
for(int i = 0;i < n; i++){
if(stu[i].a+stu[i].b+stu[i].c>min){
min = stu[i].a+stu[i].b+stu[i].c;
t = i;
}
}
printf("%s %.5d %d",stu[t].name,stu[t].num,min);
return 0;
}
7-2 结构体输出成绩最高者的信息 (10 分)
已知学生的信息包括姓名、成绩。编写程序从键盘输入5个学生的信息,输出其中成绩最高者的姓名和成绩。
输入格式:
每条信息占一行,姓名和成绩之间用空格分隔。
输出格式:
输出成绩保留1位小数。
输入样例:
aaaa 80
bbbb 95
cccc 74
dddd 65
eeee 86
输出样例:
name = bbbb, score = 95.0
#include <stdio.h>
struct {
double num;
char name[20];
}stu[101];
int main(){
int n = 5;
//scanf("%d",&n);
for(int i = 0; i < n ;i++){
scanf("%s %lf",stu[i].name,&stu[i].num);
}
double min = 0;
int t;
for(int i = 0;i < n; i++){
if(stu[i].num > min){
min = stu[i].num;
t = i;
}
}
printf("name = %s, score = %.1lf",stu[t].name,min);
return 0;
}
7-3 求1!+2!+……+n! (10 分)
求1!+2!+3!+……+n!,n<12,要求用一重循环设计程序。
输入格式:
输入一个小于12的正整数。
输出格式:
在一行中以“m=运算结果”顺序输出,其中运算结果是一个正整数,没有任何列宽控制。
输入样例:
5
输出样例:
m=153
#include <stdio.h>
int main(){
int n;
int s = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
int sum = 1;
for(int j = i; j > 0; j--){
sum *= j;
}
s += sum;
}
printf("m=%d",s);
return 0;
}
7-4 等腰直角三角形 (10 分)
等腰直角三角形是指一个角是直角,且两条直角边相等的三角形。这里我们输出直角边长为n的等腰直角三角形的格式如下所示: 比如n=1,则输出:
*
n=2,输出:
*
**
n=3,输出:
*
**
***
那么,你能用程序来实现么?
输入格式:
输入一个数n,表示三角形的边长。1<n<1000。
输出格式:
输出对应的用*表示的等腰直角三角形。
输入样例:
4
输出样例:
*
**
***
****
#include <stdio.h>
int main(){
int n;
int s = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
printf("*");
}
printf("\n");
}
//printf("m = %d",s);
return 0;
}
7-5 N阶楼梯上楼问题 (10 分)
N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。例如,当楼梯只有一阶时,只有一种方法;当楼梯有两阶时,可以每次跨一阶,跨两次,也可以每次跨两阶,跨一次,因此有两种方法。
输入格式:
输入包括一个整数N,(1<=N<46)。
输出格式:
输出当楼梯阶数是N时的上楼方式总数。
输入样例1:
3
输出样例1:
3
输入样例2:
4
输出样例2:
5
思路: 倒着分析 然后正过来 就是斐波那契数列
#include <stdio.h>
int main(){
int a[50]={1,1,2};
for(int i = 3;i < 50; i++){
a[i] = a[i-1] + a[i-2];
}
int n;
scanf("%d",&n);
printf("%d",a[n]);
return 0;
}
7-6 猴子选大王 (10 分)
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
约瑟夫环问题
#include<stdio.h>
int main(void){
int a[1002]={0};
int n,temp=0;
int out=0;
int count = 0;
scanf("%d",&n);
do{
temp++;
if(temp>n)
temp=1;
if(!a[temp])
count++;
else
continue;
if(count==3){
count=0;
a[temp]=1;
out++;
}
}while((out+1)!=n);
int i;
for(i=1;i<=n;++i){
if(!a[i]){
printf("%d\n",i);
break;}
}
return 0;
}
7-7 一维数组最大值和最小值交换 (5 分)
找出含有10个元素一维数组中的最大值和最小值,并互换这两个数的位置。
输入格式:
在一行中输入10个整数,数据之间只能用1个空格间隔。
输出格式:
在一行中按照“max=最大值,min=最小值”的格式输出结果,最大值和最小值均原样输出,没有列宽控制。 在下一行中输出交换完最大值和最小值的一维数组,每个数据输出占5列。
输入样例:
6 5 1 2 3 4 8 9 7 5
输出样例:
max=9,min=1
6 5 9 2 3 4 8 1 7 5
这道题过不了 不知道为什么 试了很多方法也考虑了多个最大最小值 还是没过 但是有1-2个大佬过了
//知道了 那个是英文的逗号
#include <stdio.h>
int main(){
int a[100];
for(int i=0;i<9;i++){
scanf("%d ",&a[i]);
}
scanf("%d",&a[9]);
int tmax,tmin;
int min = a[0];
int max = a[9];
for(int i =0;i<10;i++){
if(a[i]<min){
min = a[i];
tmin = i;
}
if(a[i]>max)
{
max = a[i];
tmax = i;
}
}
a[tmax] = min;
a[tmin] = max;
printf("max=%d,min=%d\n",max,min);
for(int i =0;i<10;i++){
printf("%5d",a[i]);
}
printf("\n");
return 0;
}
7-8 计算平均分并输出低于平均分的学生成绩 (4 分)
从键盘上输入若干(<20)个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。
输入格式:
在一行中输入若干(<20)个学生的实型成绩,用输入负数结束输入,数据之间各用一个空格间隔。
输出格式:
在一行中按照“ave=平均成绩(回车)”顺序输出平均成绩,平均成绩保留2位小数,没有列宽控制。 在下一行中输出低于平均分的学生成绩,学生成绩保留1位小数,列宽为6列。
输入样例:
85 65 74 -1
输出样例:
ave=74.67
65.0 74.0
#include <stdio.h>
int main(){
int n;
double a[20];
double sum = 0;
int count=0;
while (scanf("%d",&n)&&n!=-1){
a[count] = n;
count++;
sum += n;
}
printf("ave=%.2lf\n",sum/count);
for(int i =0; i < count;i++){
if(a[i]<(sum/count)){
printf("%6.1lf",a[i]);
}
}
}