减一运算B~2021.1.6

题目描述

给定一个由正整数组成的非空数组,也就是一个正整数N(1≤N<10​1000​​ )的各位数字,其中最高位数字存放在数组的首位, 且每个数组元素只存储一位数字。
请求出N-1对应的新数组并输出。
假设除了整数 0 之外,数组的首元素不会是零。

输入格式

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

输出格式

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

输入样例

2 8 6 6

输出样例

2 8 6 5

AC代码

#include <iostream>
using namespace std;
const int maxn = 1005;
int n[maxn] = {
    
    0};
int main()
{
    
    
	int cnt = 0,num;
	while(cin>>num){
    
    
		n[++cnt] = num;
		if(cin.get() == '\n')	break;
	}
	if(cnt == 1){
    
    
		cout<<n[1] - 1<<' ';
	}
	else{
    
    
		for(int i=cnt;i>=1;i--){
    
    
			if(n[i] != 0){
    
    
				n[i] = n[i] - 1;
				break;
			}
			else{
    
    
				n[i] = 9;
			}
		}
		if(n[1] != 0){
    
    
			for(int i=1;i<=cnt;i++){
    
    
				cout<<n[i]<<' ';
			}
		}
		else{
    
    
			for(int i=2;i<=cnt;i++){
    
    
				cout<<n[i]<<' ';
			}
		}
	}
	return 0;
}

思路与解释

①思路:题目本身并没有任何难度,难度在于各种会卡你的点。
②解释:
1)输入:

while(cin>>num){
    
    
	n[++cnt] = num;
	if(cin.get() == '\n')	break;
}

我原本的输入在while循环的条件中填入的是1,即使它形成一个死循环,通过cin.get()来捕捉回车,从而break完成输入。但是如果条件不为cin>>num,即读取到文件尾,在OJ上一定会运行超时。
2)求解:并无难度,用什么方法皆可解,可视作简化的大整数减法,不要忘记特判。
3)完美的AC。

猜你喜欢

转载自blog.csdn.net/fatfairyyy/article/details/112290921