C 语言教程 在线

1725c-exercise-example21

参考解法:

#include <stdio.h>
#include <stdlib.h>

// 设每天早上没吃之前的个数为 x 吃掉 x/2 + 1, 没吃的等于 x -(x/2 +1), 第十天早上剩一个,反推回去即可
// x - (x/2 + 1) = left, x/2 -1 = left , x = (left + 1)*2
int main(){
    int sum = 1, i;
    for(i=10; i > 0; i--) {
        printf("第%d天早上没吃的时候的个数 = %d\n", i, sum);
        sum = (sum + 1)*2;
    }
    return 0;
}

1724c-exercise-example19

参考答案中的迭代次数利用了以下结论:假设有一个正整数N,对于 N/2 < a < N,a 不可能是 n 的因子。因为可以推导出 1<N/a<2,所以迭代范围缩小为 i<=N/2。

可以对以上情形进行推广,假设有一个正整数N,N 的所有因子为 a0 a1 ... an,且 a0<a1<...<an,则有以下结论:若 a1 为 N 的因子,则 N/a1 也是 n 的因子,且 N=a0*an=a1*an-1=...。对于 an-1<i<an,i 不可能是 N 的因子;因为可以推导出 a0=N/an<N/i<N/an-1=a1,a0 和 a1 范围内不存在N的因子。所以在确定了 a 是 N 的因子之后,则可以确定 N 的另一个因子 N/a,且迭代范围可以缩小为i<N/a。

#include <stdio.h>

int perfect(int n)
{
    int s=1, t=n, i;
    for(i=2; i<t; i++)
    {
        if(n % i == 0)
        {
            t = n / i;
            s += i;
            if(t != i) s += t;
        }
    }
    if(n==s) return 1;
    else return 0;
}

int main()
{
    int i, j, t;
    for(i=1; i<1001; i++)
    {
        if(perfect(i))
        {
            printf("%d=1", i);
            t = i;
            for(j=2; j<t; j++)
            {
                if(i % j == 0)
                {
                    t = i / j;
                    printf("+%d+%d", j, t);
                }
            }
            printf("\n");
        }
    }
}

1723c-exercise-example19

参考方法:

#include<stdio.h>
int Perfect(int n);
int main(void)
{
    int i,j,count;
    for(i = 1; i <= 1000; i++)
    {
        if(Perfect(i))
        {
            count = 1;
            printf("%d=",i);
            for(j = 1; j < i; j++)
            {
                if(i % j == 0 && count == 1)
                {
                    printf("%d",j);
                    count++;
                }
                else if(i % j == 0 && count != 1)
                {
                    printf("+%d",j);
                    count++;
                }

            }

            printf("\n");
        }
    }
    return 0;
}

int Perfect(int n)
{
    int sum = 0;
    for(int i = 1; i < n; i++)
    {
        if(n%i == 0)
            sum += i;
    }
    if(n == sum)
        return 1;
    else
        return 0;
}

1722c-exercise-example19

参考代码:

#include <stdio.h>
#define MAXNUMBER 1000
int main()
{
    int sum, x, i;
    for(x = 1; x <= MAXNUMBER; x++){
        sum = 0;
        for(i = 1; i <= x/2; i++)
            if(x%i == 0)
                sum += i;
        if(sum == x)
            printf("%d\n", x);
    }
    return 0;
}

1721c-exercise-example18

使用递归方法:

#include <stdio.h>
#include <math.h>

int sumN(int a, int i);//返回i个a

int main()
{
    int sum = 0, a, n, i;
    printf("请输入 a 和 n:\n");
    scanf("%d %d", &a, &n);
    for (i = 1; i <= n; ++i)
    {
        sum += sumN(a,i);
    }
    printf("a+aa+...=%d", sum);
    return 0;
}

int sumN(int a, int i)
{
    if (i >= 1)    return sumN(a, i - 1) + a*pow(10,i-1);
    else return 0;
}