蓝桥杯
问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入 一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。然后下面的代码输入n很多是对的,n输入36时是错的,求解,或者有不有更好的方法,敬请赐教!
#include<math.h>
using namespace std;
int main()
{
int n, i, j,t=0,k=0,u=0;
int a[10] = { 0 }, b[100] = { 0 }, c[1000] = { 0 };
cin >> n;
for (j = 10; j < 100; j++)//先找五位数,左两位和右两位数字一样,所以遍历10到99;
for (i = 0; i < 10; i++)
{
int x1, x2;
x1 = j % 10;//存个位数
x2 = j / 10;//存十位数啊
if (i + 2 * (x1 + x2) == n)
{
b[k++] = j;//存五位数的前两位
a[t++] = i;//存五位数的第三位
}
}
for (i = 100; i < 1000; i++)//左三位和右三位一样,遍历100到1000
{
int x3, x4, x5;
x3 = i % 10;//个位
x4 = i / 10 % 10;//十位
x5 = i / 100;//百位
if ((x3 + x4 + x5) * 2 == n)
c[u++] = i;//存六位数前三位
}
for (i = 0; b[i] && i < 100; i++)
cout << b[i] << a[i] << b[i]%10 <<b[i]/10<< endl;//将两位数分解倒置
for (i = 0; c[i] && i < 1000; i++)
cout << c[i] <<c[i]%10<<c[i]/10%10<<c[i]/100<< endl;
return 0;
}
你用暴力列举阿...
首先轴对称.
那你只要求左边的部分就好啦。撑死3个for循环。
#include <stdio.h>
int main(){
// 第一位数字 首位不为0
for(int i =1;i<=9;i++)
// 第二位数字
for(int j = 0;j<=9;j++)
// 第三位数字
for(int k = 0;k<=9;k++)
{
// 如果 i+j+k+i+j
// 或者 i+j+k+k+j+i
// 等于你的输入的数字
// 直接打印。
}
}
供参考:
#include<iostream>
using namespace std;
int main()
{
int n, t, k, i, s;
cin >> n;
for (i = 10000; i < 1000000; i++) {
t = i; k = 0; s = 0;
while (t) {
s += t % 10;
k = k * 10 + t % 10;
t /= 10;
}
if (k == i && s == n)
cout << i << endl;
}
return 0;
}
这题可以分解为两个部分:
//判断是否为回文数
bool isHws(int num){ //10000-100000中的每一个数
int sum = 0;
while(num > 0){
sum += n % 10;
num /= 10;
}
if(sum == num){
return true;
}else{
return false;
}
}
int addSum(int num){ //10000-100000中的每一个数
int sum = 0;
while(num > 0){
sum += n % 10;
num /= 10;
}
return sum;
}
只要满足两个条件都符合,那么结果就是你想要的