习题5-4 使用函数求素数和 (20 分)
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。
素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
函数接口定义:
int prime( int p );
int PrimeSum( int m, int n );
其中函数prime
当用户传入参数p
为素数时返回1,否则返回0;函数PrimeSum
返回区间[m
, n
]内所有素数的和。题目保证用户传入的参数m
≤n
。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
int prime( int p );
int PrimeSum( int m, int n );
int main()
{
int m, n, p;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for( p=m; p<=n; p++ ) {
if( prime(p) != 0 )
printf("%d ", p);
}
printf(") = %d\n", PrimeSum(m, n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
-1 10
输出样例:
Sum of ( 2 3 5 7 ) = 17
//加不加else if(p == 2)return 1;这句话,结果都显示正确,是因为sqrt(2)=根号2,也就是说给i赋初值2后就因为不满足初始条件而退出循环,返回return1;
int prime( int p )
{
int i;
if(p <= 1)
return 0;
else if(p == 2)
return 1;
for(i = 2; i <= sqrt(p); i++)
{
if(p % i == 0)
return 0;
}
return 1;
}
int PrimeSum( int m, int n )
{
int i, sum = 0;
for(i = m; i <= n; i++)
{
if(prime(i) != 0)
{
sum += i;
}
}
return sum;
}
习题5-6 使用函数输出水仙花数 (20 分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic
判断number
是否为水仙花数,是则返回1,否则返回0。
函数PrintN
则打印开区间(m
, n
)内所有的水仙花数,每个数字占一行。题目保证100≤m
≤n
≤10000。
裁判测试程序样例:
#include <stdio.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
153 400
输出样例:
153 is a narcissistic number
370
371
//1.不细心,看错了区间,打印出给定区间(m,n)内所有的水仙花数,不包括m和n。2.通过取余数用数组存放number的各位,再用pow函数求值要简单许多
int narcissistic( int number )
{
int sum = 0, remainder, a = 1;
int n1 = number;
int n2 = number;
while(n1 > 0)
{
remainder = n1 % 10;
while(n2 > 0)
{
a *= remainder;
n2 /= 10;
}
n1 /= 10;
sum += a;
a = 1;
n2 = number;
}
if(sum == number)
return 1;
else
return 0;
}
void PrintN( int m, int n )
{
int i;
for(i = m + 1; i < n; i++)
{
if(narcissistic(i) == 1)
printf("%d\n", i);
}
}
习题5-7 使用函数求余弦函数的近似值 (15 分)
本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x0/0!−x2/2!+x4/4!−x6/6!+⋯
函数接口定义:
double funcos( double e, double x );
其中用户传入的参数为误差上限e
和自变量x
;函数funcos
应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
double funcos( double e, double x );
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
0.01 -3.14
输出样例:
cos(-3.14) = -0.999899
//忘了把每项的正负号加进去了
double funcos( double e, double x )
{
int flag = 1;
double i = 0, j = 1;
double sum = 0;
while(pow(x, 2 * i) / j >= e)
{
sum += flag * pow(x, 2 * i) / j;
i += 1;
j *= (2 * i ) * (2 * i - 1);
flag *= -1;
}
sum += flag * pow(x, 2 * i) / j;
return sum;
}
习题6-1 分类统计字符个数 (15 分)
本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。
函数接口定义:
void StringCount( char s[] );
其中 char s[]
是用户传入的字符串。函数StringCount
须在一行内按照
letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数
的格式输出。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 15
void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char s[MAXS];
ReadString(s);
StringCount(s);
return 0;
}
/* Your function will be put here */
输入样例:
aZ &
09 Az
输出样例:
letter = 4, blank = 3, digit = 2, other = 1
//1.读题不仔细,space包括空格和回车 2、逻辑判别式少加了括号,一个括号内部的东西算做一个逻辑表达式(一个条件)
void StringCount( char s[] )
{
int letter = 0, blank = 0, digit = 0, other = 0;
int i = 0;
while(s[i] != '\0')
{
if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
letter++;
else if(s[i] >= '0' && s[i] <= '9')
digit++;
else if(s[i] == ' ' || s[i] == '\n')
blank++;
else
other++;
i++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other);
}
习题6-3 使用函数输出指定范围内的完数 (20 分)
本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。
函数接口定义:
int factorsum( int number );
void PrintPN( int m, int n );
其中函数factorsum
须返回int number
的因子和;函数PrintPN
要逐行输出给定范围[m
, n
]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。
裁判测试程序样例:
#include <stdio.h>
int factorsum( int number );
void PrintPN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
PrintPN(m, n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
6 30
输出样例1:
6 is a perfect number
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
输入样例2:
7 25
输出样例2:
No perfect number
//PrintPN的难点在怎么把完数的因子和式输出, printf("%d = 1", i);printf(" + %d", j);关键在第一个因子可以确定是1,这样就可以让“+”和第二个因子进行结合
int factorsum( int number )
{
int i = 1, sum = 0;
while(i <= number / 2)
{
if(number % i == 0)
sum += i;
i++;
}
return sum;
}
void PrintPN( int m, int n )
{
int i, count = 0;
for(i = m; i <= n; i++)
{
if(factorsum(i) == i)
{
printf("%d = 1", i);
int j = 2;
while(j <= i / 2)
{
if(i % j == 0)
printf(" + %d", j);
j++;
}
count = 1;
printf("\n");
}
}
if(count == 0)
printf("No perfect number");
}
习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
函数接口定义:
int fib( int n );
void PrintFN( int m, int n );
其中函数fib
须返回第n
项Fibonacci数;函数PrintFN
要在一行中输出给定范围[m
, n
]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。
裁判测试程序样例:
#include <stdio.h>
int fib( int n );
void PrintFN( int m, int n );
int main()
{
int m, n, t;
scanf("%d %d %d", &m, &n, &t);
printf("fib(%d) = %d\n", t, fib(t));
PrintFN(m, n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
20 100 7
输出样例1:
fib(7) = 13
21 34 55 89
输入样例2:
2000 2500 8
输出样例2:
fib(8) = 21
No Fibonacci number
//又没看清题意,函数PrintFN
要在一行中输出给定范围[m
, n
]内的所有Fibonacci数,mn是Fibonacci数也就是fib(i)的值,即fib(i)<=n && fib(i)>=m的全体fib(i)的值得集合
int fib( int n )
{
if(n == 1 || n == 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
void PrintFN( int m, int n )
{
int i = 1, flag = 0;
while(fib(i) < m)
{
i++;
}
while(fib(i) <= n)
{
if(flag == 0)
{
printf("%d", fib(i));
flag = 1;
}
else
printf(" %d", fib(i));
i++;
}
if(flag == 0)
printf("No Fibonacci number");
}
今日总结:
今天一共做了17道题,基本上按计划完成了,效率还行,做题还是要细心,明天继续加油!