函数题
练习5-1 求m到n之和
#include<bits/stdc++.h>
using namespace std;
int sum(int m,int n){
int ans = 0;
for(int i=m;i<=n;i++){
ans += i;
}
return ans;
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
int ans = 0;
ans = sum(m,n);
printf("sum = %d\n",ans);
return 0;
}
练习5-2 找两个数中最大者
int max( int a, int b ){
if(a >= b) return a;
else return b;
}
练习5-3 字符金字塔
void CharPyramid( int n, char ch ){
for(int i=1;i<=n;i++){
for(int j=i;j<=n-1;j++) printf(" ");
for(int k=1;k<=i;k++) printf("%c ",ch);
printf("\n");
}
}
习题5-1 符号函数
int sign( int x ){
if(x > 0) return 1;
else if(x == 0) return 0;
else return -1;
}
习题5-2 使用函数求奇数和
int even( int n ){
if(n % 2 == 0) return 1;
else return 0;
}
int OddSum( int List[], int N ){
int ans = 0;
for(int i=0;i<N;i++){
if(even(List[i]) == 0) ans += List[i];
}
return ans;
}
习题5-3 使用函数计算两点间的距离
double dist( double x1, double y1, double x2, double y2 ){
double ans = 0;
ans = sqrt(pow(x2-x1),2) + pow(y2-y1),2));
return ans;
}
习题5-4 使用函数求素数和
注意一些特殊情况,比如题目中说整数,那么可能出现负数,要考虑到这种情况
-
素数定理: 对于一个正实数x,小于x的素数个数略大于x/lnx
-
哥德巴赫猜想:每个大于等于6的正偶数可以被分解为两个素数之和
-
0和1既不是素数也不是合数
-
素数判断
bool prime(int x){ if(x <= 1) return false; if((x%2 == 0) && (x != 2)) return false; for(int i=3;i<=sqrt(x);i+=2){ if(x % i == 0) return false; } return true; }
int prime( int p ){
if(p <= 1) return 0;
if((p%2 == 0) && p != 2) return 0;
for(int i=3;i<=sqrt(p);i+=2){
if(p % i == 0) return 0;
}
return 1;
}
int PrimeSum( int m, int n ){
int ans = 0;
for(int i=m;i<=n;i++){
if(prime(i) == 1) ans += i;
}
return ans;
}
习题5-5 使用函数统计指定数字的个数
注意一些特殊情况,比如题目中说整数,那么可能出现负数!
int CountDigit( int number, int digit ){
int cnt = 0;
int tmp = 0;
if(number < 0) number = (-1)*number; // 可能出现负数
if(number == 0){
if(digit == 0) cnt = 1;
else cnt = 0;
}
while(number != 0){
tmp = number % 10;
if(tmp == digit) cnt++;
number /= 10;
}
return cnt;
}
习题5-6 使用函数输出水仙花数
int narcissistic( int number ){
int sum = 0;
int tmp = 0;
int temp = number; // 注意这里!直接用number的话,number最后等于0,比较没有意义
while(temp != 0){
tmp = temp % 10;
sum += pow(tmp,3);
temp /= 10;
//printf("%d\n",tmp);
//printf("%d\n",sum);
}
if(number == sum) return 1;
return 0;
}
void PrintN( int m, int n ){
for(int i=m+1;i<n;i++){
if(narcissistic(i) == 1) printf("%d\n",i);
}
}
习题5-7 使用函数求余弦函数的近似值
- 每次求一遍阶乘复杂度过高,可以先打表
- 绝对值函数用fabs()
- 多读题深度理解题意,虽然最后一项小于e,但是也需要加到答案中
double funcos( double e, double x ){
int fact[21] = {1,1}; // 初始化为1
for(int i=2;i<20;i++){ // 求阶乘
fact[i] = i*fact[i-1];
//printf("%d ",fact[i]);
}
double sum = 1; // 第一项为1
int flag = -1; // 设置标志位用于判断当前符号的正负
for(int i=2;;i+=2){ // 从第二项开始
double temp = 1.0*flag*pow(x,i)/fact[i]; // 求泰勒公式每一项
sum += temp;
flag = -flag;
if(fabs(temp) < e) break; // 最后一项小于e,需要加到sum中然后再退出
}
return sum;
}
习题5-8 空心的数字金字塔
void hollowPyramid ( int n ){
int l = 1;
for(int i=1;i<=n-1;i++) printf(" "); // 第一行n-1个空格
printf("1\n");
for(int i=2;i<=n-1;i++){ // 从第二行开始
for(int j=n-i;j>=1;j--) printf(" "); // 每行n-i个空格
printf("%d",i);
for(int j=1;j<=l;j++) printf(" ");
printf("%d",i);
l += 2; // 每次多两个空格
printf("\n");
}
for(int i=1;i<=l+2;i++) printf("%d",n); // 最后一行全是n
}
习题6-1 分类统计字符个数
strlen的头文件:#include<string.h>
void StringCount( char s[] ){
int len = strlen(s);
int letter = 0,blank = 0,digit = 0,other = 0;
for(int i=0;i<len;i++){
if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) letter++;
else if(s[i] == ' ' || s[i] == '\n') blank++;
else if(s[i] >= '0' && s[i] <= '9') digit++;
else other++;
}
printf("letter = %d,bleak = %d,digit = %d,other = %d\n",letter,blank,digit,other);
}