General Palindromic Number (20分)
单词:
- palindromic number:回文数
总结:
- 进制转换→比较对应位置的数字(str[i] 和 str[index-i-1])是否相同。index为转换后数字的个数。
- 10^9在int范围内,同时在2^32内,定义一个 长度40的int数组 就够用了。
- 特例:0,输出:NO 0。
- 用int数组存储,不能用字符串存储,因为b进制下的数字大于10时,显示会出错。所以涉及数字运算的题目,能直接用整型存储,就不要转字符串,麻烦而且会出错!
- 输入:50 30,字符串存储输出(部分):1 D,但实际上应该输出:1 20
代码:
#include <cstdio>
int main(){
int str[40]; //char str[40];测试点2 4报错
int n, b, index=0;
scanf("%d %d", &n, &b);
while( n ){
str[index++] = n % b;
n /= b;
}
int flag = 1;
for(int i=0; i<index/2; i++){
if( str[i] != str[index-i-1]){
flag = 0;
printf("No\n");
break;
}
}
if( flag ) printf("Yes\n");
if( index == 0 ) printf("0");
else{
for(int i=index-1; i>=0; i--){
printf("%d", str[i]);
if( i != 0 ) printf(" ");
}
}
return 0;
}
错误代码:(字符串存储)
#include <iostream>
#include <cstring>
using namespace std;
//palindromic number
//
/*
测试点2 4不对 不用字符串存储!
输入:
50 30
输出:
No
1 D
实际上应该输出:
No
1 20
*/
int main(){
int n, b, len=0;
string s;
cin >> n >> b;
while( n ){
s = s + (char)( n % b +'0');
n /= b;
len++;
}
int flag = 1; //1:YES 0:NO
for(int i=0; i<len/2; i++){
if( s.substr(i,1) != s.substr(len-i-1,1) ){
cout<<"No"<<endl;
flag = 0;
break;
}
}
if( flag ) cout<<"Yes"<<endl;
if( len==0 ) cout<<"0";
for(int i=len-1; i>=0; i--){
cout<<s.substr(i,1);
if(i!=0) cout<<" ";
}
return 0;
}