算法设计与分析作业(第三章)

一、求2+22+222+2222+…+22…(n个2)…22(精确计算)

#include <iostream>
using namespace std;
int main()
{
    int n, a[100]{}, b[100]{}, c;
    while (1)
    {
        cout << endl << "请输入N的值:";
        cin >> n;
        c = n;//保留n原始值
        for (; n > 0; n--)
        {
            for (int i = n - 1; i >= 0; i--)//加数赋值
                b[i] = 2;
            for (int i = n - 1; i >= 0; i--)
            {
                a[i] += b[i];//逐位相加
                while (a[i] > 9)//while确保某一位小于10
                {
                    a[i] -= 10;
                    a[i + 1]++;//进位
                }
            }
        }
        cout << "精确计算的值为 : ";
        for (int i = c - 1; i >= 0; i--)//输出结果
        {
            cout << a[i];
            a[i] = 0;//用于继续测试,数组回到初始状态
        }
    }
}
运行图:

二、编写一个算法,其功能是给一维数组a输入任意6个整数,假设为5,7,4,8,9,1,然后建立一个具有如图 3-4 所示的方阵,并打印出来(屏幕输出)。

#include <iostream>
using namespace std;
int main()
{
    int a[20]{}, n;
    while (1)
    {
        cout << "请输入要输入的整数数量(<20) : ";
        cin >> n;
        cout << "请输入" << n << "个数字(逐一输入或空格间断) : " << endl;//cin的特性:空格间断
        for (int i = 0; i < n; i++)
        {
            cout << "No ." << i + 1 << " :";
            cin >> a[i];
        }
        for (int i = 0; i < n; i++)
        {
            for (int i = 0; i < n; i++)
            {
                cout << a[i] << "   ";//输出数组
            }
            cout << endl;
            int temp = a[n - 1];//取出末尾的值
            for (int i = n - 1; i >= 0; i--)//循环从后往前,给后面的数赋前面的值
            {
                if (i != 0)//当i=0时直接给末尾赋值
                    a[i] = a[i - 1];
                else
                    a[i] = temp;
            }
        }
    }
}

运行图:

三、编程打印形如图 3-5 所示的n×n方阵。 

 #include <iostream>
using namespace std;
int main()
{
    int i, j, n, k = 1, a[20][20];
    while (1)
    {
        cout << "请输入矩阵的边长 : ";
        cin >> n;
        for (i = 0; i < n / 2; i++)//计算出环的总数
        {
            for (j = i; j < n - i - 1; j++)
                a[i][j] = k++;//矩阵第一部分:上方
            for (j = i; j < n - i - 1; j++)
                a[j][n - i - 1] = k++;//矩阵第二部分:右边
            for (j = n - i - 1; j > i; j--)
                a[n - i - 1][j] = k++;//矩阵第三部分:下方
            for (j = n - i - 1; j > i; j--)
                a[j][i] = k++;//矩阵第四部分:左边
        }
        if (n % 2 != 0)//当边长为奇数时,给正中间单独的一个数赋值
            a[(n - 1) / 2][(n - 1) / 2] = n * n;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                cout << a[i][j] << "\t";//输出结果
            }
            cout << endl << endl << endl << endl;
        }
    }
}

运行图:

四、编程打印形如图 3-6 所示的n×n方阵的上三角阵。

#include <iostream>
using namespace std;
int main()
{
    int i, n, a[20][20], k, temp2 = 0, x, y;
    while (1)
    {
        for (x = 0; x <= 19; x++)
            for (y = 0; y <= 19; y++)
                a[x][y] = 0;//数组所有值初始化为0
        k = 1;//k值重置,用于再次输出三角形
        cout << "请输入上三角形上方的边长 : ";
        cin >> n;
        for (i = 0; i < n; i++)
        {
            a[i][0] = k++;//环的第一个数据
            for (int temp1 = i; temp1 > 0;)//temp1的操作在for循环中会导致temp1的值过早或过晚的改变
            {
                a[--temp1][++temp2] = k++;//所以把temp1的递减操作放到了循环里面
            }
            temp2 = 0;//每次使用完temp2后重置temp2的值用于下个环使用
        }
        for (x = 0; x < n; x++)
        {
            for (y = 0; y < n; y++)
            {
                if (a[x][y] != 0)//初始化所有值默认为0,而正常运行时不会出现0,所以排除0的数据
                    cout << a[x][y] << "\t";
            }
            cout << endl << endl << endl;
        }
    }
}
运行图:

五、编写程序打印形如图 3-7 和图 3-8 所示的 n×n 方阵。 

 #include <iostream>
using namespace std;
int main()
{
    int i, j, r, n, a[50][50]{};//C++的{}初始化更简便
    while (1)
    {
        cout << "请输入矩阵的边长 : ";
        cin >> n;
        r = n / 2;//求出环数(不包括只有一个数字的环)
        for (i = 0; i < r; i++)
        {
            for (j = i; j < n - i - 1; j++)//上方
                a[i][j] = i + 1;
            for (j = i; j < n - i - 1; j++)//右边
                a[j][n - i - 1] = i + 1;
            for (j = n - i - 1; j > i; j--)//下方
                a[n - i - 1][j] = i + 1;
            for (j = n - i - 1; j > i; j--)//左边
                a[j][i] = i + 1;
        }
        if (n % 2 != 0)//矩阵边长为奇数时触发
            a[(n + 1) / 2 - 1][(n + 1) / 2 - 1] = r + 1;//中心点赋值
        for (int x = 0; x < n; x++)
        {
            for (int y = 0; y < n; y++)
            {
                cout << a[x][y] << "\t";//输出结果
            }
            cout << endl << endl << endl << endl;
        }
    }
}

运行图:

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值