文章目录
函数题
1.其右上三角(含主对角线)元素之和
输入二维数组的所有元素,求二维数组右上三角(包括主对角线)元素之和。在这里插入代码
//在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
int fun(int a[3][3]);
int main()
{
int i,j,s,x[3][3];
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf("%d",&x[i][j]);
}
s=fun(x);
printf("sum=%d\n",s);
return 0;
}
/* 您的答案将被嵌入在这里 */
answer:
int fun(int a[3][3])
{
int sum = 0;
int i = 0;
int n = 3;
for (i = 0; i < n; i++)
{
int j = 0;
for (j = i; j < n; j++)
sum += a[i][j];
}
return sum;
}
2.逆序(函数
将一个含有n个元素的一维数组逆序存放。
#include <stdio.h>
void inv(int x[],int n);
int main()
{
int i,a[100],n;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
inv(a,n);
for (i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}
/* 请在这里填写答案 */
answer:
void inv(int a[],int n)
{
int left = 0;
int right = n-1;
while(left < right)
{
a[left] = a[right] ^ a[left];
a[right] = a[right] ^ a[left];
a[left] = a[right] ^ a[left];
left++;
right--;
}
}
3.函数选择法排序
用选择法对数组a 进行由小到大的排序
#include <stdio.h>
void fun(int a[],int n);
int main()
{
int i,a[10]={3,7,5,1,2,8,6,4,10,9};
fun(a,10);
for(i=0;i<10;i++)
printf("%3d",a[i]);
return 0;
}
/* 请在这里填写答案 */
answer:
void fun(int a[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i]<a[j])
{
a[i]=a[i]^a[j];
a[j]=a[i]^a[j];
a[i]=a[i]^a[j];
}
}
}
}
4. 用函数求平均分。
数组名作为函数参数,求平均成绩。
#include <stdio.h>
float aver(float a[ ]);
int main()
{
float sco[5],av;
int i;
for(i=0;i<5;i++)
scanf("%f",&sco[i]);
av=aver(sco);
printf("average score is %5.2f\n",av);
return 0;
}
/* 请在这里填写答案 */
answer:
float aver(float a[])
{
int i = 0;
float sum = 0.0f;
for(i = 0;i < 5;i++)
{
sum += (float)a[i];
}
return sum/5.0f;
}
5.各位上的数字之积
函数fun的功能是:计算正整数num的各位上的数字之积。例如,输入252,则输出应该是20。
#include<stdio.h>
long fun(long num);
int main()
{
long n;
scanf("%ld",&n);
printf("%ld\n",fun(n));
return 0;
}
/* 请在这里填写答案 */
answer:
long fun(long num)
{
long k = 1;
do
{
k *= num % 10;//k=k*(num%10)
num/=10;
} while (num);
return (k);
}
6.函数判断一个数是否完数。
编写函数判断一个数是否完数,在函数中给出是否完数的信息,如果是完数,函数返回1,否则返回0。然后调用它找出10000以内的全部完数。
#include <stdio.h>
int wanshu(int n);
int main()
{
int n,i;
for(n=1;n<=10000 ;n++)
if(wanshu(n) == 1)
{printf("%d=%d",n,1);
for(i=2;i<=n/2;i++)
if(n%i == 0)printf("+%d",i);
printf("\n");
}
return 0;
}
/* 请在这里填写答案 */
answer:
int wanshu(int n) {
int factors[n], sum = 0, i;
int len = 0;
for (i = 1; i < n; i++)
{
if (n % i == 0)
{
factors[len] = i;
len++;
}
}
for (i = 0; i < len; i++)
{
sum += factors[i];
}
if (sum == n)
{
return 1; // 是完数
}
else
{
return 0; // 不是完数
}
}
7.递归函数求n!
编程用递归函数求n!,然后调用该函数计算5!+7!+9!的值。
#include <stdio.h>
float fun(int n);
int main()
{
int i;
float s=0;
for(i=5;i<=9;i=i+2)
s=s+fun(i);
printf("%.0f",s);
return 0;
}
/* 请在这里填写答案 */
answer:
float fun(int n)
{
if(n > 1)
return n*fun(n-1);
return 1;
}
8.使用函数判断完全平方数
本题要求实现一个判断整数是否为完全平方数的简单函数。
#include <stdio.h>
#include <math.h>
int IsSquare( int n );
int main()
{
int n;
scanf("%d", &n);
if ( IsSquare(n) ) printf("YES\n");
else printf("NO\n");
return 0;
}
/* 你的代码将被嵌在这里 */
answer:
//方法一
int IsSquare( int n )
{
int i = 0;
if(n >= 0)
{
for(i=0;i <= n/2+1;i++)
{
if(n==i*i)
{
return 1;
}
}
}
return 0;
}
//方法二
// int IsSquare(int n)
// {
// for (int i = 0; i < sqrt(n) + 1; i++)
// {
// if (i*i == n)
// {
// return 1;
// }
// }
// return 0;
// }
9.完成求阶乘的函数
本题要求实现一个计算非负整数阶乘的简单函数,使得可以利用该函数,计算组合数 的值。
#include <stdio.h>
// 求阶乘
double Fac(int n);
int main()
{
int m, n;
scanf("%d%d", &m, &n);
printf("%g\n",(double)Fac(m)/(Fac(n)*Fac(m-n)));
return 0;
}
/* 你提交的代码将被嵌在这里 */
answer:
double Fac(int N)
{
if(N > 1)
return N*Fac(N-1);
return 1;
}
10.素数
本题要求实现一个函数,判断一个正整数是否为素数。。
#include <stdio.h>
#define N 1000
int prime(int x);
int main()
{
int x,k;
scanf("%d",&x);
k=prime(x);
if(k)
printf("%d is prime",x);
else
printf("%d is not prime",x);
return 0;
}
/* 请在这里填写答案 */
answer:
int prime(int x)
{
if(x ==2)
return 1;
int i;
for(i = 1;i<x/2;i++)
{
if(x%i==0)
return 0;
}
return 0;
}
编程题
1.计算分段函数
本题目要求计算下列分段函数f(x)的值:
注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。
#include <stdio.h>
#include<math.h>
int main()
{
double x = 0.0, result = 0.0;
scanf("%lf", &x);
if (x >= 0)
{
result = sqrt(x);
}
else
{
result = pow((x + 1), 2.0) + 2 * x + 1 / x;
}
printf("f(%0.2f) = %0.2f", x, result);
return 0;
}
2.计算符号函数的值
对于任一整数n,符号函数sign(n)的定义如下:
请编写程序计算该函数对任一输入整数的值。
输入格式:
输入在一行中给出整数n。
输出格式:
在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int y;
if (n < 0)
{
y = -1;
}
else if (n == 0)
{
y = 0;
}
else
{
y = 1;
}
printf("sign(%d) = %d", n, y);
return 0;
}
3.成绩转换
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:
输入在一行中给出一个整数的百分制成绩。
输出格式:
在一行中输出对应的五分制成绩。
#include<stdio.h>
//法一:
int main()
{
int n;
scanf("%d",&n);
if(n>=90) printf("A");
else if(n>=80&&n<90) printf("B");
else if(n>=70&&n<80) printf("C");
else if(n>=60&&n<70) printf("D");
else printf("E");
}
//法二,用switch更简单;将输入值取10的商作为case选项即可
4.计算分段函数
本题目要求计算下列分段函数f(x)的值:
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留一位小数。
#include<string.h>
#include<stdlib.h>
int main()
{
float x;
float result=0;
scanf("%f",&x);
if(x!=10)
result = x;
else
result = 1/x;
printf("f(%.1f) = %.1f\n",x,result);
return 0;
}
5.输出三角形面积和周长
本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。
注意:
在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=s(s−a)(s−b)(s−c),
其中 s=(a+b+c)/2。
#include<stdio.h>
#include<math.h>
main(){
int a,b,c;
double s,area;
scanf("%d %d %d",&a,&b,&c);
if(a+b>c&&a+c>b&&c+b>a)
{
s = (a+b+c)/2.0;
area = sqrt(s*(s-a)*(s-b)*(s-c));
printf("area = %.2f; perimeter = %.2f",area,s*2);
}
else
{
printf("These sides do not correspond to a valid triangle");
}
return 0;
}
6.简单四则运算
读入一个实数、一个操作符(仅限于+ - * /)、一个实数,求该表达式的值。若除数为0,输出“The divisor is 0.”
输入格式:
读入操作数、操作符、操作数
输出格式:
输出表达式的值(保留两位小数)。若除数为0,输出“The divisor is 0.”
#include<stdio.h>
int main()
{
float num1,num2;
char sign; //符号输入
scanf("%f",&num1);
scanf("%c",&sign);
scanf("%f",&num2);
switch(sign)
{
case '+':printf("%.2f",num1+num2);break;
case '-':printf("%.2f",num1-num2);break;
case '*':printf("%.2f",num1*num2);break;
case '/':if(num2!=0)
printf("%.2f",num1/num2);
else
printf("The divisor is 0.");
break;
default: break;
}
return 0;
}
7.统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
#include <stdio.h>
int f(int i);
int main(void){
int m,n,i,cnt1=0,sum=0;
scanf("%d%d",&m,&n);
if(m==1&&n==1)
{
sum=0;cnt1=0;
}
else
{
if(m==1)
{
m=2;
}
for(i=m;i<=n;i++)
{
if(f(i))
{
sum+=i;
cnt1++;
}
}
}
printf("%d %d",cnt1,sum);
return 0;
}
int f(int i)
{
int x,cnt=0;
for(x=2;x<i;x++)
{
if(i%x==0)
{
cnt++;
}
}
if(cnt==0)
{
return 1;
}
else
return 0;
}
8.求奇数和
本题要求计算给定的一系列正整数中奇数的和。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
#include<stdio.h>
int main(void)
{
int i,n;
int sum=0;
while(scanf("%d",&n))
{
if(n%2 ==1)
{
sum+=n;
}
if(n==0||n<0)
break;
}
printf("%d",sum);
}
9.水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
#include<stdio.h>
#include<math.h>
int main(){
int i,n,digit,a1,b,m,s;
int a[10];
scanf("%d",&n);
for(i=0;i<10;i++)
{
a[i]=pow(i,n);
}
a1=pow(10,n-1);
b=a1*10;
for(i=a1;i<b;i++)
{
m=i;s=0;
while(m!=0)
{
digit=m%10;
m/=10;
s+=a[digit];
}
if(s==i)
{
printf("%d\n",i);
}
}
return 0;
}
10.求最大值及其下标
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
#include <stdio.h>
int main(void)
{
int n,i;
scanf("%d",&n);
int a[n-1];
for(i=0; i<n;i++)
{
scanf("%d",&a[i]);
}
int maxn;
maxn=0;
for(i=1;i<n;i++)
{
if(a[i]>a[maxn])
{
maxn=i;
}
}
printf("%d %d",a[maxn],maxn);
return 0;
}
11.找完数
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
#include<stdio.h>
int main()
{
int m,n,i,j,a,b,flag=1,x;
int t[100];
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++)
{
a=1;
b=0;
for(j=2;j<i;j++)
{
if(i%j==0)
{
a+=j;
t[b++]=j;
}
}
if(i==a)
{
flag=0;
printf("%d = 1",i);
for(x=0;x<b;x++)
{
printf(" + %d",t[x]);
}
printf("\n");
}
}
if(flag)
{
printf("None\n");
}
return 0;
}
12.输出整数各位数字
本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。
输入格式:
输入在一行中给出一个长整型范围内的非负整数。
输出格式:
从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。
#include <stdio.h>
#include <math.h>
int main(){
long int n,k;
int count;
int p;
count = 0;
scanf("%ld", &n);
k = n;
if(n==0)
{
printf("%d ", 0);
}
else
{
while(k!=0)
{
k= k/10;
count++;
}
while(count>0)
{
count--;
p = pow(10,count);
printf("%d ", n/p);
n = n % p;
}
}
return 0;
}
13.字符串逆序
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
#include<stdio.h>
int main()
{
char arr[81];
char q;
gets(arr);
int a = strlen(arr);
int i = 0;
for(i = 0;i<a/2;i++)
{
q = arr[i];
arr[i] = arr[a-i-1];
arr[a-i-1] = q;
}
puts(arr);
return 0;
}
14.求矩阵各行元素之和
本题要求编写程序,求一个给定的m×n矩阵各行元素之和。
输入格式:
输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间
以空格分隔。
输出格式:
每行输出对应矩阵行元素之和
#include<stdio.h>
int main()
{
int a[6][6];
int m, n, i, j;
int sum = 0;
scanf("%d %d", &m, &n);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
sum += a[i][j];
}
printf("%d\n", sum);
sum = 0;
}
return 0;
}
15.交换最小值和最大值
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
#include <stdio.h>
int main()
{
int N,a[10],max,min,t,i;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
min=a[0];max=a[0];
for(i=1;i<N;i++)
{
if(a[i]>max)
max=a[i];
}
for(i=1;i<N;i++)
{
if(a[i]<min)
min=a[i];
}
for(i=0;i<N;i++)
if(a[i]==min)
{
t=a[0];
a[0]=a[i];
a[i]=t;
}
for(i=0;i<N;i++)
{
if(a[i]==max)
{
t=a[N-1];
a[N-1]=a[i];
a[i]=t;
}
}
for(i=0;i<N-1;i++)
printf("%d ",a[i]);
printf("%d ",a[N-1]);
return 0;
}
16.输出数组元素
本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果。
输入格式:
输入的第一行给出正整数n(1<n≤10)。随后一行给出n个整数,其间以空格分隔。
输出格式:
顺次计算后项减前项之差,并按每行三个元素的格式输出结果。数字间空一格,行末不得有多余空格。
#include<stdio.h>
int main (){
int n,i,a[10],b[9];
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
b[i]=a[i+1]-a[i];
}
int count=0;
for(i=0;i<n-1;i++)
{
if(i==0)
printf("%d",b[i]);
else if(count%3==0)
{
printf("\n");
printf("%d",b[i]);
}
else
printf(" %d",b[i]);
count++;
}
}
17.冒泡法排序
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。
输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。
#include<stdio.h>
int main()
{
int arr[100];
int N,K;
scanf("%d%d",&N,&K);
if(1 <= K&&K < N&&N <= 100)
{
int i = 0;
for(i = 0;i < N;i++)
{
scanf("%d",&arr[i]);
}
for(i = 0;i <K;i++)
{
int j = 0;
for(j = 0;j <N-1-i;j++)
{
if(arr[j] > arr[j+1])
{
arr[j] = arr[j] ^ arr[j+1];
arr[j+1] = arr[j] ^ arr[j+1];
arr[j] = arr[j] ^ arr[j+1];
}
}
}
for(i = 0;i < N-1;i++)
{
printf("%d ",arr[i]);
}
printf("%d",arr[N-1]);
}
return 0;
}