从零起步看算法(第九天 4.14)
//q10 回文数
1.明天有英语竞赛,今天的题做的有的浮躁。本以为是道水题,做下去发现要学的东西还是很多的
先贴自己的代码,有几个问题很麻烦,首先是加过之后的进位,数字转换为字符,字符转换为数字,最后的输出格式也很迷,等待以后的编改。
//q10回文数
#include<cstdlib>
#include<cstdio>
#include<stdio.h>
#include<string>
#include<cstring>
#include<iostream>
#include<assert.h>
#include<cmath>
#include<algorithm>
using namespace std;
int de_num(char x[],int num){
int sum=0;
for(int i=0;i<num;i++){
int k=0;
while(k<i){
x[i]=(x[i]+'0')*10;
k++;
}
sum=sum+(x[i]+'0');
}
return sum;
}
void fun(char x[],int y){
int count=y;
int len=strlen(x);
if(x[0]==x[len-1]){
cout<<count<<endl;
cout<<x<<endl;
return;
}
else
{
int x1=de_num(x,len);
char temple;
temple=x[0];
x[0]=x[len-1];
x[len-1]=temple;
x1+=de_num(x,len);
cout<<x1<<"--->";
sprintf(x,"%d",x1);
count++;
fun(x,count);
}
}
int main(){
int n;
char s[256]={0};
while (cin>>n){
assert(n>=0);
sprintf(s,"%d",n);
fun(s,0);
}
return 0;
}
/*
char s[256]={0};
int is_zhuan(int x,string a){
int y=0;
for(int i=0;i<a.size();i++){
if(x!=0){
a[i]=(x%10)+'0';
x=x/10;
}
}
//转换
char temple;
temple=a[0];
a[0]=a[a.size()];
a[a.size()]=temple;
for(int j=0;j<a.size();j++){
return y;
}
bool is_hui(int x,string a){
for(int i=0;i<a.size();i++){
if(x!=0){
a[i]=(x%10)+'0';
x=x/10;
}
}
if(a[0]==a[a.size()])
return true;
}
void fun(int x,string a,int count){
int y;
y=is_zhuan(x,a);
if(is_hui(x,a)){
cout<<count<<endl;
cout<<s;
cout<<x<<endl;
}
else {
sprintf(s,%s,"x--->");
return fun(x+y,a,count++);
}
}
*/
接下来是AC 版
https://blog.csdn.net/jkl46607/article/details/79619721
版本一:
#include <iostream>
#include <cmath>
using namespace std;
bool judge(int n)
{
int a[1000];
int i; //位数
for(i = 0; n; i++){
a[i]=n%10;
n/=10;
}
if(i%2==0){ // 为偶数
int sum=0;
int q=i; // 判断是不是回文的
int l=i/2;
int k=l-1; //
int flag=l;
while(l--){
if(a[flag++]==a[k--])
sum++;
}
if(sum==q/2)
return true;
else
return false;
}
if(i%2!=0){//为奇数
int sum=0;
int q = i/2-1;
int l = i/2;
int k = l;
int flag = q+2;
while(l--){
if(a[q--]==a[flag++])
sum++;
}
if(sum==k)
return true;
else
return false;
}
}
int change(int n){
int flag = n;
int b[1000];
int i,m=0;
for( i = 0; n; i++){
b[i]=n%10;
n/=10;
}
int j =i-1;
for(int k=0; k<i; k++,j--){
m+=b[k]*pow(10,j);
}
return flag+m;
}
int main()
{
int n,ans=0;
int ac[1000];
cin>>n;
int flag = n;
while(!judge(n)){
n=change(n);
ans++;
}
cout<<ans<<endl;
if(!judge(flag)){
cout<<flag;
}
while(!judge(flag)){
flag=change(flag);
cout<<"--->"<<flag;
}
return 0;
}
版本2:
需要学习vector的使用,感觉vector很有用。
#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;
vector <int> ans;
int rev(int x) {
int res = 0;
while(x) {
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
int main() {
int n;
while(cin>>n) {
ans.clear();
ans.push_back(n);
int temp = rev(n);
while(temp != n) {
n += temp;
ans.push_back(n);
temp = rev(n);
assert(n > 0);
}
cout<< ans.size() - 1 << endl;
cout<< ans[0];
for(int i =1; i < ans.size(); ++i) {
cout<< "--->" << ans[i];
}
cout<<endl;
}
return 0;
}