关于编成的几个小问题,高手请进。

小弟是一名C++菜鸟,遇到难题了,希望高手不吝赐教。题目如下:

分别打印如下3个乘法九九表:
* 1 2 3 4 5 6 7 8 9
-----------------------------
2 2 4 6 8 10 12 14 16 18
3 3 6 9 12 15 18 21 24 27
4 4 8 12 16 20 24 28 32 36
5 5 10 15 20 25 30 35 40 45
6 6 12 18 24 30 36 42 48 54
7 7 14 21 28 35 42 49 56 63
8 8 16 24 32 40 48 56 64 72
9 9 18 27 36 45 54 63 72 81

* 1 2 3 4 5 6 7 8 9
----------------------------
1 1
2 2 4
3 3 6 9
4 4 8 12 16
5 5 10 15 20 25
6 6 12 18 24 30 36
7 7 14 21 28 35 42 49
8 8 16 24 32 40 48 56 64
9 9 18 27 36 45 54 63 72 81

* 1 2 3 4 5 6 7 8 9
----------------------------
1 1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 9 12 15 18 21 24 27
4 16 20 24 28 32 36
5 25 30 35 40 45
6 36 42 48 54
7 49 56 63
8 64 72
9 81

还有一道题为:
若一头小母牛母从出生起第四个年头开始每年生一头母牛母第n年有多少头牛?

麻烦加上注释,让小弟看个明白,感激不尽!
每个乘法中分别表都要对齐,这里粘贴时出了点问题。

第1个回答  推荐于2016-09-27
-----------------------------------------------------------
1.  3个乘法九九表: 
#include "stdio.h"
#include "conio.h"

/*  ld ---->   LeftDown part of the table  左下角  */
/*  ur ---->   UpRigth  part of the table  右上角  */
void t99(int ld,int ur)
{   int i,j;
    printf("\n %-3c|",'x');
    for(i=1;i<10;i++)
        printf("%4d",i);
    printf("\n----|");
    for(i=1;i<10;i++)
        printf("%s","----");
    printf("\n");
    for(i=1;i<10;i++)
    {   printf(" %-3d|",i);
        for(j=1;j<10;j++)
        {   if( i==j )printf("%4d",i*j);   /* 对角线上的元素 */
            else
            {   if(ld==1 && j<i )printf("%4d",i*j);     /*  输出左下角  */
                else
                    if(ur==1 && j>i )printf("%4d",i*j); /*  输出右上角  */
                    else printf("    ");                /*  输出4个空格 */
            }
        }
        printf("\n");
    }

}

main()
{   int i;
    t99(1,1);     /*   同时输出左下角和右上角     */
    for(i=1;i<10;i++)  printf("%s","*****");
    t99(0,1);     /*  不输出左下角,只输出右上角   */
    for(i=1;i<10;i++)  printf("%s","*****");
    t99(1,0);     /*  只输出左下角,不输出右上角   */
    getch();
}
-------------------------------------------------------------------
2. 这个问题存在一定的问题,他并没有说明母牛多长时间生一头公牛,
也没有说母牛只生母牛,而问题问的是第n年有多少头牛?而不是第n年有多少头母牛?
以下假设母牛只生母牛,问题也问的是 :第n年有多少头母牛?
#include "stdio.h"
#include "conio.h"

main()
{   int No[100],i,n;
    printf("请输入n(n<100)");
    scanf("%d",&n);
    for(i=0;i<3;i++)  No[i]=1; /* 初始化数组,头3年都只有一头母牛 */
    for(i=3;i<n;i++)  No[i]=No[i-3]+No[i-1];
    printf("%d",No[(n-1)%3]);
    getch();
}
/*  每年牛的数目:  0  0  0  0  1  1  1  2  3  4  6  9  13 19  28 41 60 88 129 189 */
/*  第j年          -3 -2 -1 0  1  2  3  4  5  6  7  8  9  10  11 12 13 14 15  16  */
/* */
/*形式改变为:
 第 j-3 j-2 j-1 j 年:   相对应4年的牛的数目
   j=0              :      0   0   0   0
   j=1              :      0   0   0   1  <--- 初始的数量
   j=2              :      0   0   1   1  <--- 1 = 前1年的基数(1) + 前面第3年的牛的数量(0,注:它们在今年都生了一头小母牛)
   j=3              :      0   1   1   1  <--- 1 = 前1年的基数(1) + 前面第3年的牛的数量(0)
   j=4              :      1   1   1   2  <--- 1 = 前1年的基数(1) + 前面第3年的牛的数量(1)
   j=5              :      1   1   2   3  <--- 1 = 前1年的基数(2) + 前面第3年的牛的数量(1)
   j=6              :      1   2   3   4  <--- 1 = 前1年的基数(3) + 前面第3年的牛的数量(1)
   j=7              :      2   3   4   6  <--- 1 = 前1年的基数(4) + 前面第3年的牛的数量(2)
   j=8              :      3   4   6   9  <--- 1 = 前1年的基数(4) + 前面第3年的牛的数量(2)
   j=9              :      4   6   9  13  <--- 1 = 前1年的基数(4) + 前面第3年的牛的数量(2)

形式进一步改变为:
 第 j-3 j-2 j-1 j 年:   相对应4年的牛的数目
   j=0              :  0   0   0   0

   j=1              :  0   0   0   1 ←初始的数量

   j=2              :  0   0   1   1 ←——┐
                       ↑      ↑          │
                       │      │          │
   前面第3年的牛的数量(0)+前1年的基数(1) =  1

   j=3              :  0   1   1   1 ←——┐
                       ↑      ↑          │
                       │      │          │
   前面第3年的牛的数量(0)+前1年的基数(1) =  1

   j=4              :  1   1   1   2←———┐
                       ↑      ↑           │
                       │      │           │
   前面第3年的牛的数量(1)+前1年的基数(1)  = 2

   j=5              :  1   1   2   3←———┐
                       ↑      ↑           │
                       │      │           │
   前面第3年的牛的数量(1)+前1年的基数(2)  = 3

   j=6              :  1   2   3   4←———┐
                       ↑      ↑           │
                       │      │           │
   前面第3年的牛的数量(1)+前1年的基数(3) =  4

   j=7              :  2   3   4   6←———┐
                       ↑      ↑           │
                       │      │           │
   前面第3年的牛的数量(2)+前1年的基数(4) =  6

   j=8              :  3   4   6   9←———┐
                       ↑      ↑           │
                       │      │           │
   前面第3年的牛的数量(3)+前1年的基数(6) =  9

   j=9              :  4   6   9  13←———┐
                       ↑      ↑           │
                       │      │           │
   前面第3年的牛的数量(4)+前1年的基数(9) =  13

以下是一个更简单的程序,但理解可能有一定难度:
#include "stdio.h"
#include "conio.h"

main()
{   int No[3],i,j,j_1,n;
    printf("请输入n(n<100)");
    scanf("%d",&n);
    for(i=0;i<3;i++)  No[i]=1; /* 初始化数组,头3年都只有一头母牛 */
    for(i=3,j=0,j_1=2;i<n;i++,j_1=j,j=((j==2)?0:j+1))  No[j]=No[j]+No[j_1];
    printf("%d",No[(n-1)%3]);
    getch();
}本回答被提问者采纳
相似回答