第六章 函数
第一节 函数
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=1∑n−1i(i∣n)=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](n≥2)中有多少个素数。
【输入】
输入 n ( 2 ≤ n ≤ 50000 ) n(2≤n≤50000) n(2≤n≤50000)。
【输出】
素数个数。
【输入样例】
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 < b ) b(a<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)i−12i−1x2i−1
和
π = 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} 10−6时 π π π的值。
【输入】
(无)
【输出】
π π π的值。保留到小数点后 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 6−100所有偶数表示成两个素数之和。
【输入】
(无)
【输出】
分行输出,每个数只拆开一次,请保证第一个加数最小。
【输入样例】
(无)
【输出样例】
(无)
【答案&代码】
#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