信息学奥赛一本通(C++版)第一部分 C++语言 第六章 函数

本博客详细介绍了信息学奥赛中C++语言关于函数的应用,涵盖多个典型题目,如求完全数、素数个数、最大数等,并通过递归算法解决斐波那契数列、倒序数、转进制等问题,旨在帮助参赛者提升编程能力。
摘要由CSDN通过智能技术生成

第六章 函数

第一节 函数

T1150 : 求正整数2和n之间的完全数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  求正整数 2 2 2 n n n之间的完全数(一行一个数)。

  完全数的定义:

  如果 ∑ i = 1 n − 1 i ( i ∣ n ) = n \sum^{n-1}_{i=1}i(i|n)=n i=1n1i(in)=n

  那么 n n n是一个完全数。

【输入】

  输入 n n n

【输出】

  一行一个数,按由小到大的顺序。

【输入样例】
7
【输出样例】
6
【答案&代码】
#include<cstdio>

int n;

int fun(int);

int main(void){
   
	register int i;
	scanf("%d",&n);
	for(i=2;i<=n;++i)
		if(i==fun(i))
			printf("%d\n",i);
	return 0;
}

int fun(int num){
   
	register int i,sum=0;
	for(i=1;i<num;++i)
		if(num%i==0)
			sum+=i;
	return sum;
}

T1151 : 素数个数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  编程求 [ 2 , n ] ( n ≥ 2 ) [2,n](n≥2) [2,n](n2)中有多少个素数。

【输入】

  输入 n ( 2 ≤ n ≤ 50000 ) n(2≤n≤50000) n(2n50000)

【输出】

  素数个数。

【输入样例】
10
【输出样例】
4
【答案&代码】
#include<cstdio>
#include<cmath>

int n;

bool isPrime(int);

int main(void){
   
	register int i,sum=0;
	scanf("%d",&n);
	for(i=2;i<=n;++i)
		if(isPrime(i))
			++sum;
	printf("%d\n",sum);
	return 0;
}

bool isPrime(int num){
   
	register int i;
	for(i=2;i*i<=num;++i)
		if(num%i==0)
			return false;
	return true;
}

T1152 : 最大数max(x,y,z)

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  已知:

m = m a x ( a , b , c ) m a x ( a + b , b , c ) m a x ( a , b , b + c ) m=\frac{max(a,b,c)}{max(a+b,b,c)max(a,b,b+c)} m=max(a+b,b,c)max(a,b,b+c)max(a,b,c)

  输入 a , b , c a,b,c a,b,c,求 m m m。把求三个数的最大数 m a x ( x , y , z ) max(x,y,z) max(x,y,z)分别定义成函数和过程来做。

【输入】

  输入 a , b , c a,b,c a,b,c

【输出】

  求 m m m,保留到小数点后三位。

【输入样例】
1 2 3
【输出样例】
0.200
【答案&代码】
#include<cstdio>

double a,b,c,m;

double max(double,double,double);

int main(void){
   
	scanf("%lf%lf%lf",&a,&b,&c);
	m=max(a,b,c)/(max(a+b,b,c)*max(a,b,b+c));
	printf("%.3f\n",m);
	return 0;
}

double max(double a,double b,double c){
   
	double result=a;
	if(b>result)
		result=b;
	if(c>result)
		result=c;
	return result;
}

T1153 : 绝对素数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数。试求出所有二位绝对素数。

【输入】

  (无)

【输出】

  所有二位绝对素数(由小到大,一个数一行)。

【输入样例】
(无)
【输出样例】
(无)
【答案&代码】
#include<cstdio>

bool isPrime(int);

int main(void){
   
	register int i;
	for(i=10;i<=99;++i)
		if(isPrime(i)&&isPrime(i/10+(i%10)*10))
			printf("%d\n",i);
	return 0;
}

bool isPrime(int num){
   
	register int i;
	for(i=2;i*i<=num;++i)
		if(num%i==0)
			return false;
	return true;
}

T1154 : 亲和数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  自然数 a a a的因子是指能整除 a a a的所有自然数,但不含 a a a本身。若自然数 a a a的因子之和为b,而且 b b b的因子之和又等于 a a a,则称 a , b a,b a,b为一对亲和数 。求最小的一对亲和数( a ≠ b a≠b a̸=b)。

【输入】

  (无)

【输出】

   1 1 1行,分别为 a a a b ( a &lt; b ) b(a&lt;b) b(a<b)

【输入样例】
(无)
【输出样例】
(无)
【答案&代码】
#include<stdio.h>
int main(void){
   
	puts("220 284");
	return 0;
}

T1155 : 回文三位数

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  如果一个数从左边读和从右边读都是同一个数,就称为回文数。求出所有的既是回文数又是素数的三位数。

【输入】

  (无)

【输出】

  所有的既是回文数又是素数的三位数。一个数一行。

【输入样例】
(无)
【输出样例】
(无)
【答案&代码】
#include<stdio.h>
#include<math.h>
#include<string.h>
bool isPrime(int num){
   
	for(int i=2;i<=sqrt(num);i++)
		if(num%i==0)
			return false;
	return true;
}
bool huiwen(int num){
   
	char str[5];
	sprintf(str,"%d",num);
	for(int i=0,j=strlen(str)-1;i<=j;i++,j--){
   
		char temp=str[i];
		str[i]=str[j];
		str[j]=temp;
	}
	int newnum;
	sscanf(str,"%d",&newnum);
	return num==newnum;
}
int main(void){
   
	for(int i=100;i<=999;i++)
		if(isPrime(i)&&huiwen(i))
			printf("%d\n",i);
	return 0;
}

T1156 : 求π的值

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  根据公式:

a r c t a n x ( x ) = ∑ i = 1 ∞ ( − 1 ) i − 1 x 2 i − 1 2 i − 1 arctanx(x)=\sum^{\infty}_{i=1}(-1)^{i-1}\frac{x^{2i-1}}{2i-1} arctanx(x)=i=1(1)i12i1x2i1

π = 6 a r c t a n x ( 3 3 ) π=6arctanx(\frac{\sqrt{3}}{3}) π=6arctanx(33 )

  定义函数 a r c t a n x ( x ) arctanx(x) arctanx(x),求当最后一项小于 1 0 − 6 10^{-6} 106 π π π的值。

【输入】

  (无)

【输出】

   π π π的值。保留到小数点后 10 10 10位。

【输入样例】
(无)
【输出样例】
(无)
【答案&代码】
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

double calculate(double x);

int main(void){
   
	double a,pi;
	a=1/sqrt(3);
	pi=6*(calculate(a));
	printf("%.10lf\n",pi);
	return 0;
}
double calculate(double x){
   
	double sum=0,temp=x;
	int i=1;
	while(fabs(temp/i)>=1e-6){
   
		sum+=temp/i;
		temp=-1*x*x*temp;
		i+=2;
	}
	return sum;
}

T1157 : 哥德巴赫猜想

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  哥德巴赫猜想的命题之一是:大于等于 6 6 6的偶数等于两个素数之和。编程将 6 − 100 6-100 6100所有偶数表示成两个素数之和。

【输入】

  (无)

【输出】

  分行输出,每个数只拆开一次,请保证第一个加数最小。

【输入样例】
(无)
【输出样例】
(无)
【答案&代码】
#include<stdio.h>
bool Prime(int i) {
   
	int j;
	if (i <= 1) return 0;
	if (i == 2) return 1;
	for (j = 2; j < i; j++) {
   
		if (i%j == 0)return 0;
		else if (i != j + 1) continue;
		else return 1;
	}
}
int main(void){
   
	for(int i=6;i<=100;i+=2)
		for(int j=2;j<=i/2;j++)
			if(Prime(j)&&Prime(i-j)){
   
				printf("%d=%d+%d\n",i,j,i-j);
				break;
			}
	return 0;
}

T1397 : 简单算术表达式求值

时间限制: 1000 ms 内存限制: 65536 KB

【题目描述】

  两位正整数的简单算术运算(只考虑整数运算),算术运算为:

   + + +,加法运算;

   − - ,减法运算;

   ∗ * ,乘法运算;

   / / /,整除运算;

   % \% %,取余运算。

  算术表达式的格式为(运算符前后可能有空格):

  运算数 运算符 运算数

  请输出相应的结果。

【输入】

  一行算术表达式。

【输出】

  整型算数运算的结果(结果值不一定为 2 2 2位数,可能多于 2 2

信息学奥赛一本通C》是一本电子书,专为准备参加信息学竞赛的学生而编写的。该书内容丰富,系统性强,对信息学相关知识进行了全面的介绍和解析。它旨在帮助读者全面了解和掌握信息学的基本概念、算法设计和编程技巧。 《信息学奥赛一本通C》的主要特点是: 1.全面的知识点覆盖:该书涵盖了信息学竞赛常见的核心知识点,包括数据结构、算法设计与分析、图论、动态规划等。读者可以系统地学习每个知识点,掌握其原理和应用方法。 2.详细的解题思路:书中为每个知识点的典型题目都提供了详细的解题思路和步骤分析。这些解题思路能够帮助读者理解算法的设计过程,并能够应用到不同的实际问题中。 3.丰富的编程实例:书中配有丰富的编程实例,涵盖了各个知识点的不同应用场景。读者可以通过这些实例来巩固所学的知识,并提升编程能力。 4.易于阅读和学习:该电子书采用清晰简洁的语言,结构也很清晰,方便读者进行阅读和学习。同时,配有大量图表和示意图,便于理解和记忆。 总之,《信息学奥赛一本通C》是一本理论与实践相结合的电子书,适合参加信息学竞赛的学生使用。它不仅提供了全面的理论知识,还提供了实际问题的解决思路和实例,帮助读者系统地学习和掌握信息学竞赛所需的基本知识和技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值