题目描述
给定一个由正整数组成的非空数组,也就是一个正整数N(1≤N<101000 )的各位数字,其中最高位数字存放在数组的首位, 且每个数组元素只存储一位数字。
请求出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。