PTA-C语言

函数题

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;
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值