C语言-第十二周做题总结-函数2

id:706 A.字符金字塔

题目描述

本题要求实现函数输出n行字符金字塔。

函数接口定义:
void CharPyramid( int n, char ch);

其中n和ch是用户传入的参数,n为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行由字符ch构成的字符金字塔。注意每个字符后有一个空格。

输入

整数n,字符ch

输出

见输出样例

输入样例

4 G

输出样例

   G 
  G G 
 G G G
G G G G 

题解

  • 打印出三角形,说明函数不需要返回,则用void
  • 在主函数中,输入n和ch
  • 在自定义函数中,需要用到两重循环,三个循环,则为在第二重循环中,需要用到两个for循环
  • 第一重循环控制输出的行数
  • 在第二重循环中,第一个循环的作用是输出空格,每行需要n - 1个空格,第二个循环的作用的是输出字符,每行需要i个字符(i为表示第几行),在第二重循环结束后,即完成第一行输出后,需要一个换行符

代码

#include <stdio.h>
#include <stdlib.h>
void CharPyramid(int n, char ch);

int main(int argc, char *argv[])
{
	int n;
	char ch;
	scanf("%d %c", &n, &ch);
	CharPyramid(n, ch);
	return 0;
}

void CharPyramid(int n, char ch)
{
	int i, j;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n - i; j++)
		{
			printf(" ");
		}
		for (j = 1; j <= i; j++)
		{
			printf("%c ", ch);
		}
		printf("\n");
	}
}

id:388 B.空心的数字金字塔

题目描述

本题要求实现一个函数,输入一个正整数n(1<=n<=9),输出n行空心的数字金字塔。要求定义和调用函数hollow_pyramid(n)打印出n行空心的数字金字塔。

输入

正整数n(1<=n<=9)

输出

见输出样例

输出样例

5

输入样例

    1
   2 2
  3   3
 4     4
555555555

题解

  • 自定义的函数也是不需要返回
  • 在主函数中,输入n
  • 在自定义函数中,需要用到一个三重循环,和一个一重循环,第一个循环只用于输出 n - 1行金字塔,第二个循环只用于输出第n行
  • 在第一个三重循环中,第一重用来控制行数,第二重循环用来输出空格,空格输出完后,循环结束,并打印出第一个数字,此数字就是表示此行,然后进行条件判断,若此行时第一行,则直接打印出换行符,否则,进到第三重循环中,第三重循环的作用是,打印出空格,形成空心形状,打印完空格后,结束循环,并输出数字,此数字是代表此行的数字,注意,打印空格和数字都属于判断语句中
  • 在第二个一重循环中,进入循环的条件是打印的个数小于此行数乘以二再减一,执行语句是只输出一个数字,此循环结束后打印输出一个换行符

代码

#include <stdio.h>
#include <stdlib.h>
void hollow_pyramid(int n);

int main(int argc, char *argv[])
{
	int n;
	scanf("%d", &n);
	hollow_pyramid(n);
	return 0;
}

void hollow_pyramid(int n)
{
	int i, j, k;
	
	for (i = 1; i < n; i++)
	{
		for (j = 1; j <= n - i; j++)
		{
			printf(" ");
		}
		printf("%d", i);
		if (i > 1)
		{
			for (k = 1; k <= 2 * i - 3; k++)
			{
				printf(" ");
			}
	        printf("%d", i);
	    }
	    printf("\n");
	}
    for (i = 1; i <= 2 * n - 1; i++)
	{
		printf("%d", n);
	}
	printf("\n");
}

id:377 C.使用函数输出水仙花数

题目描述

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。

输入两个正整数m和n(100≤m≤n≤10000),输出开区间(m,n)内所有的水仙花数。本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间内所有的水仙花数。

要求定义并调用函数narcissistic(number)判断number是否为水仙花数,是则返回1,否则返回0。定义并调用函数print_n(m,n)按从小到大的顺序输出区间(m,n)内所有的水仙花数。

输入

两个正整数m和n(100≤m≤n≤10000)

输出

见样例

输出样例

153 400

输入样例

370
371

题解

  • 此题调用两个函数,一个函数需要返回值,一个函数不需要返回值
  • 在主函数中,输入m和n,调用函数print_n(m, n),
  • 在函数narcissistic(number)中,需要用到一个while循环和一个条件判断语句,循环的目的是分解传入的数,即判断其是三位数还是四位数,作为if语句的判断条件,在if else语句中进行返回1或0的动作
  • 在函数print_n(m, n)中,需要用到一个for循环,此循环的作用是遍历从m + 1
    到n - 1的所有数,因为主函数传入了m和n的值,并进行条件判断语句,在条件判断中,调用函数narcissistic(number),如果返回值为1,则输出并打印出换行符

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int narcissistic(int number);
void print_n(int m, int n);

int main(int argc, char *argv[])
{
	int m, n;
	scanf("%d %d", &m, &n);
	print_n(m, n);
	return 0;
}

int narcissistic(int number)
{
	int x, t;
	t = number;
	x = 1;
	
	while (t > 9)
	{
		t /= 10;
		x *= 10;
	}
	if (x == 100)
	{
		if (number == pow(number % 10, 3) + pow(number / 10 % 10, 3) + pow (number / 100, 3))
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
	else
	{
		if (number == pow(number % 10, 4) + pow(number / 10 % 10, 4) + pow(number / 100 % 10, 4) + pow(number / 1000, 4))
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
}

void print_n(int m, int n)
{
	int j;
	for (j = m + 1; j < n; j++)
	{
		if (narcissistic(j))
		{
			printf("%d\n", j);
		}
	}
}

id:380 D.使用函数输出指定范围内的完数

题目描述

本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。

要求定义并调用函数factorsum(number),它的功能是返回 number的因子和;定义和调用函数print_pn(m,n)逐行输出给定范围[m,n]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

输入

两个正整数m和n(0<m<=n<=10000)

输出

见样例

输入样例

6 30

输出样例

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

题解

  • 此题需要调用用到两个函数,一个函数需要返回值,一个函数不需要返回值
  • 在主函数中,输入m和n的值,并调用函数print_pn(m, n)
  • 在自定义函数factorsum(int number)中,先是用一个for循环,找出此数的因数,即能被次数整除的数,找出后相加,返回加完后结果的值
  • 在自定义函数print_pn(int m,int n)中,先是用for循环,遍历从m到n的所有数,并把他们传递到函数factorsum(int number)中,若返回值与传入值相等,则再进行一次循环,找出因数并相加

代码

#include <stdio.h>
#include <stdlib.h>
int factorsum(int number);
void print_pn(int m, int n);

int main(int argc, char *argv[])
{
	int m, n;
	scanf("%d %d", &m, &n);
	print_pn(m, n);
	return 0;
}

int factorsum(int number)
{
	int j, x, s;
	s = 0;
	for (j = 1; j < number; j++)
	{
		x = number % j;
		if (x == 0)
		{
			s += j;
		}
	}
	return s;
}

void print_pn(int m, int n)
{
	int k, z, i, x, y;
	y = 0;
	    
	for (k = m; k <= n; k++)
	{
		z = factorsum(k);
		if (k == z)
		{
			x = 0;
			y = 1;
			for (i = 1; i < k; i++)
			{
				if (k % i == 0 && x == 0)
				{
					printf("%d = %d", k, i);
				}
				else if (k % i == 0 && x == 1)
				{
					printf(" + %d", i);
				}
				x = 1;
			}
			printf("\n");
		}
	}
	if (y == 0)
	{
		printf("No perfect number");
	}
}

id:379 E.使用函数输出指定范围内的Fibonacci数

题目描述

本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

要求定义并调用函数fib(n),它的功能是返回第n项Fibonacci数。例如fib(7)返回值是13。定义并调用函数print_fn(m,n)输出给定范围[m,n]内的所有Fibonacci数,相邻数字间有一个空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。

输入

两正整数m和n(0<m≤n≤10000)

输出

见样例

输入样例

20 100

输出样例

21 34 55 89

题解

  • 此题用到一个需要返回值的函数,一个不需要返回值的函数
  • 在主函数中,先输入m, n,并调用函数print_fn(m, n)
  • 在自定义函数fib(int n)中,需要用到while循环,找出大于传入的数且与其最近的斐波那契数并传回
  • 在自定义函数print_fn(int m, int n)中,需要定义一个变量,目的是用来判断返回的数是否与上一次返回的数相同,然后进行一个for循环,遍历从m到n的所有数,并将其传到函数fib(int n)进行寻找斐波那契数,如果传回的数小于n且不与上一次传回的数相等,则输出,并让其赋值给表示上一次传入的数的变量,如果此范围内没有斐波那契数,则输出No Fibonacci number,即表示上一次数的变量为赋初值,即没有改变此值的意思

代码

#include <stdio.h>
#include <stdlib.h>
int fib(int n);
void print_fn(int m, int n);

int main(int argc, char *argv[])
{
	int m, n;
	scanf("%d %d", &m, &n);
	print_fn(m, n);
	return 0;
}

int fib(int n)
{
	int f, j, k;
    j = 1;
    k = 1;
    f = 0;
	while (f < n)
	{
		f = j + k;
		j = k;
		k = f;
	}
	return f;
}

void print_fn(int m, int n)
{
	int i, result, last;
	result = 0;
	last = -1;
	for (i = m; i <= n; i++)
	{
		result = fib(i);
		if (result <= n && last != result)
		{
			printf("%d ", result);
			last = result;
		}
	}
	if (last == -1)
	{
		printf("No Fibonacci number");
	}
}
  • 22
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值