2021-12-06 自动化专业C语言上机作业参考答案10

上机练习10

p704.c

/*
编写一程序P704.C实现以下功能
  一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。
从键盘输入一个正整数(约定该数≤32767、此时因子数≤100),找出该数以内的所有完数及其因子。
编程可用素材:printf("Please input an integer: ")、printf("… is a wanshu"…、printf(" %d"…。

思考:
    1 因子如何判定
        1,2,3这些数,但肯定不会超过data/2
    2 有可能有多因子,肯定用数组来存放,输出这些因子,肯定要跑循环,未知个数,事先要统计计数
    3 判断完数,肯定有求和过程,要有累加求和
    4 很多个数都要判断,肯定要跑循环,起点和终点是什么?如果每一个数都要判断,步长肯定是1

*/
#include <stdio.h>
#define N 100

int main(void)
{
    int data;
    int i, j;
    int fact[N];
    int sum, count;

    printf("Please input an integer: ");
    scanf("%d", &data);

    // 从2开始,该数以内
    for (i = 2; i < data; i++)
    {
        // 找所有因子,因子从1开始,暴力,一个个试
        // 每一次都要重新初始化和值和计数器
        sum = 0;
        count = 0;
        for (j = 1; j <= i / 2; j++)
        {
            // 是因子,即可整除
            if (i % j == 0)
            {
                // 完成计数,求和,存储
                fact[count++] = j;
                sum += j;
            }
        }
        // 做判断和输出
        if (i == sum)
        {
            printf("%6d is a wanshu", i);
            // 所有因子输出
            for (j = 0; j < count; j++)
            {
                printf(" %d", fact[j]);
            }
            printf("\n");
        }
    }

    return 0;
}

p706.c

/*
编写一程序P706.C实现以下功能
  输入任意10个整数,对这10个整数从小到大排序并输出。
编程可用素材:printf("Please input 10 number:\n")、printf("%5d"...。
*/
#include <stdio.h>
#define N 10
int main(void)
{
    int data[N], tmp;
    int i, j;
    printf("Please input 10 number:\n");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &data[i]);
    }
    // sort bubble,使用冒泡排序
    for (i = 0; i < N - 1; i++)	// n-1轮
    {
        for (j = 0; j < N - 1; j++)	// 因为要用到j+1,所以j最多取到n-2,即<n-1
        {
            if (data[j] > data[j + 1])
            {
                tmp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = tmp;
            }
        }
    }
    // output
    for (i = 0; i < N; i++)
    {
        printf("%6d", data[i]);
    }

    return 0;
}

p713.c

/*
编写一程序P713.C实现以下功能
  用scanf输入某年某月某日,判断这一天是这一年的第几天?以3月5日为例,
应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份≥3时需考虑多加一天。
注:判断年份是否为闰年的方法——为400的倍数为闰年,如2000年;若非100的倍数,而是4的倍数,为闰年,如1996年。
编程可用素材:
printf("Please input year-month-day: ")...、
printf("\nIt is the ...th day.\n"...。
*/
#include <stdio.h>

int main(void)
{
    int day, month, year, sum;
    printf("Please input year-month-day: ");
    scanf("%d-%d-%d", &year, &month, &day);

    switch (month)
    {
    case 1:
        sum = 0;
        break;
    case 2:
        sum = 31;
        break;
    case 3:
        sum = 59;
        break;
    case 4:
        sum = 90;
        break;
    case 5:
        sum = 120;
        break;
    case 6:
        sum = 151;
        break;
    case 7:
        sum = 181;
        break;
    case 8:
        sum = 212;
        break;
    case 9:
        sum = 243;
        break;
    case 10:
        sum = 273;
        break;
    case 11:
        sum = 304;
        break;
    case 12:
        sum = 334;
        break;
    default:
        printf("data error");
    }

    sum += day;
    if ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && month > 2)
        sum++;

    printf("\nIt is the %dth day.\n", sum);
    return 0;
}

p714.c

/*
编写一程序P714.C实现以下功能
  用scanf输入10个整数(采用int数据类型),计算所有正数的和、负数的和以及10个数的和。
编程可用素材:
    printf("Input 10 integers: ")、
    printf("\nzhengshu=…,fushu=…,all=…。
*/
#include <stdio.h>
#define N 10
int main(void)
{
    int a[N];
    int zhengshu = 0, fushu = 0, all = 0;
    int i;
    printf("Input 10 integers: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
        if (a[i] > 0)
        {
            zhengshu += a[i];
            all += a[i];
        }
        else if (a[i] < 0)
        {
            fushu += a[i];
            all += a[i];
        }
        else
        {
            all += a[i];
        }
    }

    printf("\nzhengshu=%d,fushu=%d,all=%d", zhengshu, fushu, all);

    return 0;
}

p717.c

/*
编写一程序P717.C实现以下功能
  输入10个整型数存入一维数组,输出值和下标都为奇数(数组第1个元素的下标为0)的元素及其个数,要求先输出个数。
编程可用素材:printf("Input 10 integers: ")、printf("\ncount=…\n"…、printf("a[…]=…\n"…。
*/
#include <stdio.h>
#define N 10

int main(void)
{
    int a[N], zhi[N], xb[N];
    int i;
    int count = 0;
    printf("Input 10 integers: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }
    // record it
    for (i = 0; i < N; i++)
    {
        if (a[i] % 2 != 0 && i % 2 != 0)
        {
            zhi[count] = a[i];
            xb[count] = i;
            count++;
        }
    }

    printf("\ncount=%d\n", count);
    for (i = 0; i < count; i++)
    {
        printf("a[%d]=%d\n", xb[i], zhi[i]);
    }

    return 0;
}

p718.c

/*
编写一程序P718.C实现以下功能
  有一递推数列,满足f(0)=0,f(1)=1,f(2)=2,  f(n+1)=2f(n)+f(n-1)f(n-2) (n>=2), 编写程序求f(n)的值(n由键盘输入,13>=n>=2)。
编程可用素材:printf("Input n (13>=n>=2): ")、printf("\nf(…)=…\n"…。
*/

#include <stdio.h>
#define N 15

int main(void)
{
    int i, n;
    double fn[N] = {0, 1, 2};
    printf("Input n (13>=n>=2): ");
    scanf("%d", &n);
    for (i = 2; i < n; i++)
    {
        // 迭代求值
        fn[i + 1] = 2 * fn[i] + fn[i - 1] * fn[i - 2];
    }
    printf("\nf(%d)=%.0lf\n", n, fn[n]);

    return 0;
}

p725.c

/*
编写一程序P725.C实现以下功能
  利用数组,求斐波拉契数列的前n(约定3≤n≤20)项并输出到屏幕上(数和数之间用水平制表符'\t'隔开),
斐波拉契公式为:f(1)=1,  f(2)=1,  f(n) = f(n-1) + f(n-2) (n≥3)。
编程可用素材:printf("input a data(3--20): ")。
*/
#include <stdio.h>
#define N 21

int main(void)
{
    int i, n;
    double fn[N] = {1, 1};
    printf("input a data(3--20): ");
    scanf("%d", &n);
    for (i = 2; i < n; i++)
    {
        // 迭代求值
        fn[i] = fn[i - 1] + fn[i - 2];
    }
    for (i = 0; i < n; i++)
    {
        printf("%.0lf\t", fn[i]);
    }

    return 0;
}

p739.c

/*
编写一程序P739.C实现以下功能
  从键盘输入年月日日期,计算出该日期是公元纪年以来的第几天。
注:判断年份是否为闰年的方法——为400的倍数为闰年,如2000年;若非100的倍数,而是4的倍数,为闰年,如1996年。
编程可用素材:printf("input a data(year-month-day):")...、printf("\nThe result is ....\n"...。
*/
#include <stdio.h>

int main(void)
{
    int year, month, day;
    int i;
    int sum = 0;
    int monthday[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    printf("input a data(year-month-day):");

    // year
    scanf("%d-%d-%d", &year, &month, &day);
    for (i = 1; i < year; i++)
    {
        sum += 365;
        if (i % 400 == 0 || i % 4 == 0 && i % 100 != 0)
        {
            sum++;
        }
    }
    //month
    for (i = 1; i < month; i++)
    {
        sum += monthday[i];
    }
    // add leap year
    if ((year % 400 == 0 || year % 4 == 0 && year % 100 != 0) && month > 2)
    {
        sum++;
    }
    // day
    sum += day;
    printf("\nThe result is %d\n", sum);

    return 0;
}

p742.c

/*
编写一程序P742.C实现以下功能
  现有两个一维数组(各含5个整型元素)设为A、B,从键盘分别输入数据给这两个数组。
计算A数组正序位置与B数组逆序对应位置积的和。
编程可用素材:
    printf("Input A: ")、printf("Input B: ")、printf("\nsum=…\n"…。
*/
#include <stdio.h>
#define N 5

int main(void)
{
    int a[N], b[N];
    int i;
    int sum = 0;
    printf("Input A: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }
    printf("Input B: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &b[i]);
    }

    // get sum
    for (i = 0; i < N; i++)
    {
        sum += a[i] * b[N - i - 1];
    }

    printf("\nsum=%d\n", sum);

    return 0;
}

p746.c

/*
编写一程序P746.C实现以下功能
  从键盘读入10个整数,对其按由小到大的顺序进行排序,然后输出。编程可用素材:
printf("please input 10 integer numbers: ");
printf("\nthe array before sorted: ");
printf("\nthe array after  sorted: ");
*/

#include <stdio.h>
#define N 10

int main(void)
{
    int a[N];
    int i, j, min, tmp;
    printf("please input 10 integer numbers: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }
    printf("\nthe array before sorted: ");
    for (i = 0; i < N; i++)
    {
        printf("%d ", a[i]);
    }

    // sort data min->max
    for (i = 0; i < N - 1; i++)
    {
        min = i;
        for (j = i + 1; j < N; j++)
        {
            if (a[j] < a[min])
            {
                min = j;
            }
        }
        // 最小值归位,有可能没动
        tmp = a[i];
        a[i] = a[min];
        a[min] = tmp;
    }

    printf("\nthe array after  sorted: ");
    for (i = 0; i < N; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}
  • 1
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

风车车的大表哥

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值