5555555
好想躺在床上
【id:706】【20分】A. 练习5-3 字符金字塔
下面有三个代码,第一个是普通的,剩下两个用了递归
1.上课写的所以乱乱的
#include <stdio.h>
void CharPyramid(int n, char ch) {
for (int t = n - 1, c = 1; t >= 0 && c <= n; t--, c++) { //t为一行中要输出的空格数,c为字符数 //循环输出n行
for (int i = t; i > 0; i--) { //循环输出t个空格
printf(" ");
}
for (int i = c; i > 0; i--) { //循环输出c个字符
printf("%c ", ch);
}
printf("\n");
}
}
int main() {
int n;
char ch;
scanf("%d %c", &n, &ch);
CharPyramid(n, ch);
return 0;
}
2.递归,循环行数包含在定义的函数里了
#include <stdio.h>
int t = 1; //t为要输出字符的个数
void CharPyramid(int n, char ch) {
if (n >= 0) {
for (int i = 1; i <= n; i++) { //循环输出空格
printf(" ");
}
for (int i = 1; i <= t; i++) { //循环输出字符
printf("%c ", ch);
}
printf("\n");
t++;
CharPyramid(n - 1, ch);
}
}
int main() {
int n;
char ch;
scanf("%d %c", &n, &ch);
CharPyramid(n - 1, ch); //是n-1!!
return 0;
}
3.递归,循环的行数在定义函数的外面
#include <stdio.h>
int t = -1;
void CharPyramid(int n, char ch) {
if (n > 0) {
printf(" ");
CharPyramid(n - 1, ch);
} else if (t < n) {
printf("%c ", ch);
CharPyramid(n - 1, ch);
}
}
int main() {
int n;
char ch;
scanf("%d %c", &n, &ch);
for (; n > 0; n--, t--) { //循环输出n行
CharPyramid(n - 1, ch);
printf("\n");
}
return 0;
}
【id:388】【20分】B. 实验5-11 空心的数字金字塔
下面是硬解,暂时没有想到其他好方法(枯萎)
思路:
1.弄清楚输入的数与每一行空格数和数字的联系
2.想办法输出
#include <stdio.h>
void hollow_pyramid(int n) {
for (int t = 1; t < n; t++) { //循环n-1行
for (int i = n - t; i > 0; i--) { //输出空格
printf(" ");
}
printf("%d", t); //输出数字
for (int i = 2 * t - 3; i > 0; i--) { //再输出空格
printf(" ");
}
if (t - 1 != 0) //再输出数字(排除1情况)
printf("%d", t);
printf("\n");
}
for (int i = n + n - 1; i > 0; i--) { //输出最后一行全是数字的
printf("%d", n);
}
}
int main() {
int n;
scanf("%d", &n);
hollow_pyramid(n);
return 0;
}
【id:377】【20分】C. 实验6-11 使用函数输出水仙花数
之前做的水仙花数的plus版!!!注意是“每个位上的数字的N次幂之和等于它本身”,所以需要先判断位数再进行计算。
思路:
1.先要知道数的长度
2.在知道数的长度后,把数一位一位取出并power计算再相加,判断是否是水仙花数plus版
#include <stdio.h>
#include <math.h>
int narcissistic(int n) {
int i = 0, n2 = n, tmp = 0, y = 0; //i用于计算数长度
while (n2 >= 1) { //计算长度
n2 /= 10;
i++;
}
n2 = n;
while (n2 >= 1) { //取位计算
tmp = n2 % 10;
n2 /= 10;
y += pow(tmp, i);
}
if (y == n)
return 1;
return 0;
}
void print_n(int m, int n) {
for (m++; m < n; m++) {
if (narcissistic(m))
printf("%d\n", m);
}
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
print_n(m, n);
return 0;
}
【id:380】【20分】D. 实验6-8 使用函数输出指定范围内的完数
思路:
1.掏出数的所有因数并相加,判断与原数是否相等
2.若相等则想办法按格式输出
#include <stdio.h>
int flag = 0; //flag为指示,如果有完数就会改变数值,如果没有就不变
void factorsum(int m) {
int y = 1, t = 0;
int a[1005] = {0}; //初始化数组,防止出现奇奇怪怪的东西
for (int i = 2; i < m; i++) {
if (m % i == 0) { //查找因数
y += i; //计算因数和
t++;
a[t] = i;
}
}
if (y == m) { //如果因数相加和为原数
printf("%d = 1", m);
flag++;
for (int i = 1; i <= t; i++) {
printf(" + %d", a[i]);
}
printf("\n");
}
}
void print_pn(int m, int n) {
for (; m <= n; m++) {
factorsum(m);
}
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
print_pn(m, n);
if (flag == 0) //如果没有出现完数的话
printf("No perfect number");
return 0;
}
【id:379】【20分】E. 实验6-9 使用函数输出指定范围内的Fibonacci数
有两个方向的想法:
1.拿斐波那契数列来跟mn比较,即拿算出的斐波那契值,把在mn区间里的都输出
2.拿mn来跟斐波那契数列比较,我一开始是用这个写的,巨麻烦
1.拿斐波那契数列来跟mn比较
#include <stdio.h>
int fib(int month) { //这个是从我之前写的兔子数列那用cv大法拿过来改了一下装上来的
int sex = 0, pro = 0, neww = 1, total = 1;
for (int i = 1; i <= month;) {
i++;
sex = sex + pro;
pro = neww;
neww = sex;
total = total + neww;
}
return total;
}
void print_fn(int m, int n) { //拿斐波那契数列来跟mn比较
int t = 0;
for (int i = 1; fib(i) <= n; i++)
{
if (m <= fib(i))
{ //因为for循环已经确定上限的条件了,所以这里不需要再加上”&&fib(i)<=n“
if (t != 0)
printf(" ");
printf("%d", fib(i));
t = 1;
}
}
if (t == 0)
printf("No Fibonacci number");
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
print_fn(m, n);
return 0;
}
2.拿mn来跟斐波那契数列比较
这是我最开始写的(因为只有print_fn(m,n)函数不一样所以其他就省略了)
void print_fn(int m, int n) { //拿mn来跟斐波那契数列比较
int t = 0;
for (; m <= n; m++)
{
for (int i = 1; fib(i) + fib(i + 1) <= m; i++)
{
if (fib(i) + fib(i + 1) == m)
{
if (t != 0)
printf(" ");
printf("%d", m);
t = 1;
}
}
}
if (t == 0)
printf("No Fibonacci number");
}
然后下面是2改良了一下减小了运算的版本:
void print_fn(int m, int n){ //拿mn来跟斐波那契数列比较
int t = 0, i = 2;
for (; m <= n; m++)
{
i--;
int a = fib(i), b = fib(i + 1); //保存值在变量中减少重复调用fib函数增加计算量
for (; a + b <= m; i++, a = fib(i), b = fib(i + 1))
{
if (a + b == m)
{
if (t != 0)
printf(" ");
printf("%d", m);
t = 1;
}
}
}
if (t == 0)
printf("No Fibonacci number");
}
当然都不如1.的想法。。2.这个想法就是我当时脑子混乱不知道怎么写出来的……
感觉现在写的都好生硬……
写是能写出来,但是看到别人写代码的总会觉得自己的很拉跨
周五要高数期中考,救命