头歌C语言实验 辅助练习8:自定义函数

第1关:素数判定 II

问题描述
素数(Prime Number),又称为质数,它是不能被1和它本身以外的其它整数整除的正整数,按照这个定义,负数、0和1都不是素数。
请设计并编写一个函数,用于判定一个自然数是否是素数。
主函数中请用户输入一个正整数n,调用自定义函数进行判定,如果n是素数则输出Yes,否则输出No。

输入
一个正整数n。

输出
若n为素数输出Yes,否则输出No。

输入示例
37

输出示例
Yes

提示
设计函数时重点关注函数自身的功能,而不要考虑整个程序的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
int isPrime(int n){
int i;
int flag=1;
if(n==0||n==1||n<0){
return 0;
}else if(n==2)
return 1;
else{
for(i=2;i<n;i++){
if(n%i==0){
flag=0;
}
}
return flag;
}
}
int main(){
int n;
scanf("%d",&n);
if(isPrime(n))
printf("Yes");
else
printf("No");
return 0;
}

第2关:静态变量求和

问题描述
函数中的静态局部变量,在程序的整个执行过程中,其声明语句只会执行一次。

请利用这个特点,参考教材上例7.1,编写一段程序,针对用户输入的正整数n,利用静态局部变量对1~n之间的所有能被3整除的整数求和并输出结果。

输入
一个正整数n。

输出
1~n之间的所有能被3整除的整数之和。

输入示例
54

输出示例
sum=513

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int Func(int i);
int main(){
int n,i;
int sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum=Func(i);
}
printf("sum=%d",sum);
}
int Func(int i){
static int sum=0;
if(i%3==0)
sum+=i;
return sum;
}

第3关:几位数 II

问题描述
对于用户输入的一个非负整数n,请使用递归的方法编程判断n是一个几位整数。
注意:0是1位数。

相关知识
函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

例如:

1
2
3
4
5
int fun(int x){
int y,z;
z = fun(y); //在执行fun函数的过程中又要调用fun函数
return (2*z);
}

在调用 f 函数的过程中,又要调用 f 函数,这就是直接调用。如果在调用 f1 函数的过程中又要调用 f2 函数,而在调用 f2 函数过程中又要调用 f1 函数,这就是间接调用本函数。

上面的例子中,递归调用是无终止的自身调用。显然,程序中不应出现这种无终止的递归调用,而只应出现有限次数的、有终止的递归调用,这可以用 if 语句来控制,只有在某一条件成立时才继续执行递归调用,否则就不再继续。

输入
一个任意的非负整数n,测试数据输入的n不会超过unsigned int所能表示的最大值(4294967295)。

输出
参照示例按照“非负整数y是一个x位整数。”的格式输出判断结果,其中y和x要用实际数值代替。

输入示例
8482

输出示例
非负整数8482是一个4位整数。

提示
对于任意整数,如果用它整除10可以去掉其个位数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int Func(int n,int sum);
int main(){
int n;
int sum=1;
scanf("%d",&n);
if(n>=10){
sum=Func(n,sum);
}
printf("非负整数%d是一个%d位整数。",n,sum);
}
int Func(int n,int sum){
if(n/10>=10){
sum++;
Func(n/10,sum);
}else
return sum+1;
}

第4关:整数分割输出

问题描述
本关任务:用递归法将一个整数 n (任意位数的整数)分割成各位数字并输出,各个数字字符之间用空格隔开。

例如,输入483,应输出字符串4 8 3。

相关知识
函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

例如:

1
2
3
4
5
int fun(int x){
int y,z;
z = fun(y); //在执行fun函数的过程中又要调用fun函数
return (2*z);
}

在调用 f 函数的过程中,又要调用 f 函数,这就是直接调用。如果在调用 f1 函数的过程中又要调用 f2 函数,而在调用 f2 函数过程中又要调用 f1 函数,这就是间接调用本函数。

上面的例子中,递归调用是无终止的自身调用。显然,程序中不应出现这种无终止的递归调用,而只应出现有限次数的、有终止的递归调用,这可以用 if 语句来控制,只有在某一条件成立时才继续执行递归调用,否则就不再继续。

输入
一个整数n。

输出
从高位到低位的各位上的数字字符,每两个数字字符之间用一个空格分开。

输入示例
1385

输出示例
1 3 8 5

提示
用户输入n可能是一个负数,此时可以把n转换为对应的正数继续处理,同时需要输出负号(-)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<math.h>
void Func(int n,int m);
int main(){
int n,t,m=0;
scanf("%d",&n);
if(n<0){
n=abs(n);
printf("- ");
}
if(n<10)
printf("%d",n);
else{
t=n;
while(t/10!=0){
t/=10;
m++;
}
Func(n,m);
}
return 0;
}
void Func(int n,int m){
printf("%d",n/(int)pow(10,m));
if(m>0){
printf(" ");
Func(n%(int)pow(10,m),m-1);
}
}