说说对网站推广的看法和想法百度博客收录提交入口
题目描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入
一个正整数 n (10< n< 100), 表示要求满足的数位和。
输出
若干行,每行包含一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899 499994 589985 598895 679976 688886 697796 769967 778877 787787 796697 859958 868868 877778 886688 895598 949949 958859 967769 976679 985589 994499
方法一(简单取巧):
#include<stdio.h>
int main()
{int a,b,c,flag=1,i,n;scanf("%d",&n);for(i=1;i<=2;i++)for(a=1;a<10;a++)for(b=0;b<10;b++)for(c=0;c<10;c++) if(2*a+2*b+i*c==n){flag=0;if(i==1) printf("%d%d%d%d%d\n",a,b,c,b,a);else printf("%d%d%d%d%d%d\n",a,b,c,c,b,a);}if(flag) printf("-1\n"); return 0;
}
方法二:
#include <stdio.h>
int main(void)
{int n, flag = 1;scanf("%d", &n);for(int i = 10000; i < 1000000; ++i){int t = i, num = 0, sum = 0;while(t>0){num = num*10 + t%10;sum += t%10;t /= 10;}if(num==i && sum==n){flag = 0;printf("%d\n", i);}}if(flag){printf("-1\n");}return 0;
}
解题思路:
题目种说5位数和6位数的,并且从小到大;我直接按顺序遍历10000到1000000(不包括)之间的数,把么一个数就求其回文和给位数字之和来判断时候复合要求;判断回文:数组也可以做到,但是在本题种使用本人的做法可以简单的将判断回文和求个位数字之和一起方便求得;比如给出1221:1221%10=1 ->1221/10=122 -> 1*10+122%10=12 ->122/10=12
->12*10+12%10=122 -> 12/10=1 -> 122*10+1%10=1221 得到1221与原来给出得相等;
在举个反例:123:123%10=3 -> 123/10=12 -> 3*10+12%10=32 -> 12/10=1 ->32*10+1%10=321;
123 != 321 故不是回文数;
求个位数字之和只用在求回文得时候 每次取余得到得数累加求和即可。
注意事项:
在判断回文的时候,记得用一个临时变量代替正在遍历的数,不然会影响遍历顺序,导致程序出错。
方法三:
#include<iostream>
using namespace std;
bool check(int a[],int j){ //判断是否回文 int i;for(i=0;i<j;i++){if(a[i]!=a[j-i-1])return false;}return true;
}
int main()
{int n;cin>>n;int flag = 0;for(int i=10001;i<=999999;i++){int sum=0;int temp = i;int *b = new int(6);int j = 0;while(temp){sum+=temp%10;b[j++] = temp%10;temp/=10;}if(check(b,j)&&n == sum){flag = 1;cout<<i<<endl;}delete []b;}if(flag == 0){cout<<-1<<endl;}return 0;
}