1-4 减一运算B

***

1-4 减一运算B (20分)


给定一个由非负整数组成的非空数组,也就是一个正整数N(1≤N<10
​1000
​​ )的各位数字,其中最高位数字存放在数组的首位, 且每个数组元素只存储一位数字。

请求出N-1对应的新数组并输出。

假设除了整数 0 之外,数组的首元素不会是零。

输入格式:
输入在一行中给出正整数N的各位数字,用空格隔开

输出格式:
输出N-1的各位数字,用空格隔开

输入样例:
2 8 6 6

输出样例:
2 8 6 5

#include <iostream>
using namespace std;
const long long int maxn = 100000LL;
int main(){
	int n, a[maxn], len = 0;
    while(cin >> n){
	    a[len++] = n;
	    if(cin.get()=='\n')   break; 	
    }
	if(len == 1)  printf("%d ", a[0] - 1);
	else{
		for(int i = len; i >= 0; i--){
			if(a[i] != 0){
				a[i] = a[i] - 1;
				break;
			}
			else   a[i] = 9;
		}
		if(a[0] == 0){
			for(int i = 1; i < len; i++)    printf("%d ", a[i]);
		}
		else{
			for(int i = 0; i < len; i++)    printf("%d ", a[i]);
		}
	}
	return 0;
}

非常抱歉,我的回答有误。在这种情况下,我们应该将向量表示为两个坐标的差,即 `B - A`。接下来的步骤与之前的回答相同: 1. 计算向量 BA 的模长 `|BA|`。 2. 计算向量 OA 的模长 `|OA|`。 3. 计算圆心 O 到向量 BA 所在直线的距离 `d`,即 `d = |BA × OA| / |BA|`,其中 `×` 表示向量的叉积运算。 4. 如果 `d > r`,那么不存在与该向量平行且与圆相切的向量,直接返回空值或错误提示。 5. 如果 `d = r`,那么向量 BA 所在直线与圆相切,在交点处取法向量为向量 BA 的单位向量,再乘以向量 BA 的模长,即可得到与该向量平行且与圆相切的向量的方向向量。 6. 如果 `d < r`,那么向量 BA 所在直线与圆相交,交点即为与该向量平行且与圆相切的向量的起点。交点到圆心 O 的连线与向量 BA 垂直,在交点处取法向量为该连线的单位向量,再乘以圆的半径,即可得到与该向量平行且与圆相切的向量的方向向量。 7. 最后,根据所得到的方向向量,可以计算出与该向量平行且与圆相切的向量的起点和终点。 下面是 Python 代码实现: ```python import numpy as np def parallel_tangent_vector(A, B, O, r): BA = B - A OA = A - O BA_norm = np.linalg.norm(BA) OA_norm = np.linalg.norm(OA) d = np.abs(np.cross(BA, OA)) / BA_norm if d > r: print("向量与圆不相交") return None elif d == r: u = BA / BA_norm v = u * BA_norm else: u = (O - B + BA / BA_norm * r) / np.linalg.norm(O - B + BA / BA_norm * r) v = u * r return A, A + v ``` 其中,`A`、`B`、`O` 分别表示向量的起点、终点和圆心的坐标,`r` 表示圆的半径。函数返回的是与向量平行且与圆相切的向量的起点和终点的坐标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值