算法设计与分析 3.1 杨辉三角、沙漠穿越、猴子吃桃、数组移位及优化、大数乘法

思考题一

int main()
{
	int n;
	int i;
	int num = 1;
	printf("输入天数:n=");
	scanf("%d", &n);
	for (i = 0;i < n; i++)
	{
		num = (num + 1) * 2;
	}
	printf("%d", num);
}

                T(n)=O(n)

思考题二 

int Gcd(int a, int b)
{
	int r;
	r = a % b;
	while (r)
	{
		a = b;
		b = r;
		r = a % b;
	}
	return b;
}
void Memory_move(int n, int k, int a[6])
{
	int temp,p;
	int q = Gcd(n, k);
	for (int i = 0;i < q;i++)
	{
		p = i;
		temp = a[p];
		printf("%d\n", temp);
		for (int j = 0;j < n / q-1;j++)
		{
			a[p] = a[(p+k)%n];
			p = (p + k) % n;
		}
		a[p] = temp;
	}
	for (int i = 0;i < n;i++)
		printf("%d", a[i]);
}
int main()
{
	int n = 6, k = 2;
	int a[6] = {0,1,2,3,4,5};
	Memory_move(n, k, a);
}

思考题三

如何优化?

将每次循环的最后一个要移动的数a[p]存在temp中,然后将前一个数a[(-k)modn]移动到a[p]位置,循环完成

void Memory_move(int n, int k, int a[6])
{
	int temp,p;
	int q = Gcd(n, k);
	for (int i = 0;i < q;i++)
	{
		p = i;
		for (int j = 0;j < n / q-1;j++)
		{
			p =(p+k)%n;
		}
		temp = a[p];
		for (int j = 0;j < n / q;j++)
		{
			a[p] = a[(p-k)%n];
			p = (p - k) % n;
		}
		a[i] = temp;
	}
	for (int i = 0;i < n;i++)
		printf("%d", a[i]);
}

思考题四

void func(int x[], int y[])
{
	int n_1 = sizeof(x) / sizeof(int);
	int n_2 = sizeof(y) / sizeof(int);
	int b,temp,n;
	int num[10] = {0};
	int i, j;
	int temp_1 = 1;
	for (i = 0;i <n_2;i++)
	{
		for (b = y[i];b != 0;b = b/10)
		{
			n = b % 10;
			int d = 0;
			temp = 0;
			for (j = 0;j <n_1;j++)
			{
				temp = x[j] * n*temp_1 + d;
				num[i + j] = temp % 1000000+num[i+j];
				d = temp  / 1000000;
			}
			temp_1 *= 10;
		}
		printf("!");
	}
	for (i = 0;i < sizeof(num) / sizeof(int);i++)
		printf("%d\n", num[i]);
}

#include<iostream>
#include<string>
using namespace std;
//移位进位法
string Mul(string left, string right)
{
 	size_t Lsize = left.size();		//size_t = unsigned int
    size_t Rsize = right.size();
    size_t Size = Lsize + Rsize;	//最长位数
    string res(Size, '0');
 
    int takevoer = 0;//进位
    int offset = 0;//移位
 
    size_t idx = 1, j = 1;
    for (idx = 1; idx <= Rsize; ++idx)
    {
        takevoer = 0;
        int rightnum = right[Rsize - idx] - '0';
        //计算每一位与left相乘
        for (j = 1; j <= Lsize; ++j)
        {
            char resBit = res[Size - j - offset] - '0';		//取res存储对应位的数字
            int num = rightnum * (left[Lsize - j] - '0') + takevoer + resBit;//将两个数相乘,将进位和数组内存的数加入
            takevoer = num / 10;
            res[Size - j - offset] = num % 10 + '0';		//先把个位存进去
        }
        if (takevoer != 0)
            res[Size - j - offset] = takevoer + '0';
        offset++;
    }
 
    //如果没有进位的话,res最高位没有数字
    if (res[0] == '0')
        res.erase(0, 1);
    return res;
}
 
int main()
{
    string s1, s2;
    cin >>s1 >> s2;
    string str=Mul(s1,s2);
    cout << str << endl;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是关于算法设计与分析杨辉三角的多种解法: 1. 使用列表存储每一行的值,利用上一行的值计算当前行的值,然后将每一行的列表打印出来。 ```python def generate_pascals_triangle(numRows): triangle = [] for row_num in range(numRows): row = [None for _ in range(row_num + 1)] row[0], row[-1] = 1, 1 for j in range(1, len(row) - 1): row[j] = triangle[row_num - 1][j - 1] + triangle[row_num - 1][j] triangle.append(row) return triangle def print_pascals_triangle(triangle): for row in triangle: print(row) numRows = 5 triangle = generate_pascals_triangle(numRows) print_pascals_triangle(triangle) ``` 2. 使用生成器函数生成每一行的值,然后打印出整个杨辉三角。 ```python def generate_pascals_triangle(numRows): result = [] for i in range(numRows): row = [1] * (i + 1) for j in range(1, i): row[j] = result[i - 1][j - 1] + result[i - 1][j] result.append(row) return result def print_pascals_triangle(triangle): for row in triangle: print(row) numRows = 5 triangle = generate_pascals_triangle(numRows) print_pascals_triangle(triangle) ``` 3. 使用递归函数计算每一行的值,然后打印出整个杨辉三角。 ```python def generate_pascals_triangle(numRows): if numRows == 0: return [] elif numRows == 1: return [[1]] else: result = generate_pascals_triangle(numRows - 1) last_row = result[-1] new_row = [1] + [last_row[i] + last_row[i + 1] for i in range(len(last_row) - 1)] + [1] result.append(new_row) return result def print_pascals_triangle(triangle): for row in triangle: print(row) numRows = 5 triangle = generate_pascals_triangle(numRows) print_pascals_triangle(triangle) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值