[NOIP2011 普及组] 数字反转
题目描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入格式
一个整数 N
输出格式
一个整数,表示反转后的新数。
输入输出样例
输入 #1复制
123
输出 #1复制
321
输入 #2复制
-380
输出 #2复制
-83
说明/提示
数据范围
−1,000,000,000≤N≤1,000,000,000。
noip2011普及组第一题
因为测试数据没那么大,所以可以不使用字符串操作,按照计算累加逆置
如下代码(AC代码C++)
#include <iostream>
using namespace std;
int main()
{
int n = 0, ans = 0;
//-8 % 10 = -8
for (cin >> n; n != 0; n = n / 10)
ans = ans * 10 + n % 10;
cout << ans << endl;
return 0;
}
扩展:
如果是测试数据的数字异常大那么就得使用字符串操作了,字符串操作可以使用c++自带的那些工具函数,非常方便解决。
如下代码(AC代码C++)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s;
cin >> s;
//负数的话符合不参加逆置
if (s[0] == '-')
reverse(++s.begin(), s.end());
else
reverse(s.begin(), s.end());
//字符串转换数字
//其实在高位数字里这个转换会爆
int ans = stoi(s);
cout << ans << endl;
return 0;
}
不借助c++算法函数,纯c版本。在这里有个坑就是字符串是“0”的话不进行去零操作。不然就没有输出了
AC代码(C语言)
#include <cstdio>
#include <cstring>
using namespace std;
void myreverse(char s[], int _min, int _max)
{
//数组下标是0开始的计算长度是从1开始的所以必须减去1
int max = --_max;
int min = _min;
char temp;
while (max > min)
{
temp = s[max];
s[max] = s[min];
s[min] = temp;
max--;
min++;
}
}
void removeZero(char s[], int len)
{
//前缀递减是因为数组下标0开始算长度从1开始计
//前缀递减刚好能补差,一开始就从长度-1
while (s[--len] == '0')
;
//判定循环结束时会导致多判定多减一次所以得加一
s[++len] = '\0';
}
int getStrLengh(char s[])
{
int i = 0;
while (s[i])
i++;
return i;
}
int main()
{
char s[64] = { 0 };
scanf("%s", s);
//字符串仅仅只有0的话不进行去零操作
if (strcmp(s, "0") != 0)
removeZero(s, getStrLengh(s));
//减号不参与反转
if (s[0] == '-')
myreverse(s, 1, getStrLengh(s));
else
myreverse(s, 0, getStrLengh(s));
puts(s);
return 0;
}
另一种写法,不进行字符串逆置而是逆输出
#include<cstdio>
#include<cstring>
int main()
{
char str[100];
int length, flag = 0;
scanf("%s", str);
//-号如果有那么一定要输出
if (str[0] == '-')
printf("%c", str[0]);
//求长度
length = strlen(str);
//字符串是“0”情况直接输出0
if (length == 1 && str[0] == '0')
printf("0");
else
for (int i = length - 1; i >= 0; i--)
{
//从尾部非零元素进行输出,非零标记
if (str[i] != '0')
flag = 1;
//如果碰到减号就直接停止因为减号以及输出过了
if (str[i] == '-')
break;
if (flag != 0)
printf("%c", str[i]);
}
return 0;
}
PS部分测试数据:
输入
0
输出
0