问题:输入一个正整数\(n\)(\(1 \le n \le 10^{16}\)),计算并输出\(n\)的逆序数。正整数\(n\)的逆序数就是\(n\)倒着念的整数(高位不能有多余的0),例如123的逆序数是321,5700的逆序数是75。
分析:使用循环拆分出存储在long long类型变量\(n\)每位上的数字,一边拆分一边组装逆序数。(可参阅【循环结构例题一】中例题【五、逆序数】的详细讲解)
#include<iostream>
using namespace std;
int main()
{
long long n,m = 0;
cin>>n;
while(n){
m = m*10 +n%10;
n /= 10;
}
cout<<m<<endl;
return 0;
}
问题变形:输入的正整数\(n\)的位数不超过100位,计算并输出\(n\)的逆序数。
分析:正整数\(n\)的位数不超过100位,不能再使用int、long long这样的基本数据类型存储正整数\(n\),可以使用字符串来存储。那么此时逆序数就是字符串逆序输出,但是要避免输出高位多余的0。
#include<iostream>
#include<cstring>
using namespace std;
char num[110]; //额外多开一些
int main()
{
cin>>num;
//逆序找到第一个不是'0'的字符
int i = strlen(num)-1;
while(num[i]=='0') i--;
//从下标i开始逆序输出
while(i>=0){
cout<<num[i--];
}
return 0;
}
此外还可以使用string来存储整数,并且使用string的find_last_not_of方法逆向找到第一个不是'0'的字符的位置:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string num;
cin>>num;
//用string的find_last_not_of方法返回逆向第一个不是'0'的字符的位置
int i = num.find_last_not_of('0');
while(i>=0) cout<<num[i--];
return 0;
}
当然,也可以使用find_last_of方法返回字符串逆序查找"123456789"中任意字符的第一处位置,其实就是逆向第一个不是'0'的字符的位置:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string num;
cin>>num;
//用string的find_last_of方法返回num逆序查找"123456789"中任意字符的第一处位置
int i = num.find_last_of("123456789");
while(i>=0) cout<<num[i--];
return 0;
}
NOIP学习小站