咖啡


私信TA

用户名:Tianxn

访问量:138599

签 名:

十年OI一场空,不开LL见祖宗。

等  级
排  名 10
经  验 27368
参赛次数 10
文章发表 197
年  龄 22
在职情况 学生
学  校 西安电子科技大学
专  业 软件工程

  自我简介:

解题思路:刚来这个网站不久,看了前辈们写的题解,感觉有点沉长,题目种说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 <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;
}


 

0.0分

119 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

我不理解我的代码跟你的不一样吗,怎么我就过不了
#include<stdio.h>
#include<stdbool.h>

bool Palindromic_Number(int a,int m){
    int i,x,y=0,sum=0;
    x=a;
    while(a>0){
        sum+=a%10;
        y=y*10+a%10;
        a=a/10;
    }
    if(y==x&&sum==m)
    return true;
    else
    return false;
}

int main(){
    int m,i,sigh1=0;
    scanf("%d",&m);
    for(i=10000;i<1000000;++i){
        if(Palindromic_Number(i,m)){
            printf("%d\n",i);
            int sigh1=1;
        }

    }
    if(sigh1==0)
        printf("-1\n");

    return 0;
}
2021-10-14 16:23:12
能不能解释t>0这个怎么退出来? 谢谢
2020-06-12 18:27:35
#include <bits/stdc++.h>
using namespace std;

int main(){
	int x1,x2,x3,x4,x5,x6;
	int n;
	bool a=false;
	
	scanf("%d",&n);
	
	for(int i=100;i<=999;i++){

		x3=i%10;
		x2=i/10%10;
		x1=i/100%10;
		x4=x2;
		x5=x1;
		if((x1+x2+x3+x4+x5)==n)cout<<i<<x4<<x5<<endl,a=true;
	}
	
	for(int i=100;i<=999;i++){

		x3=i%10;
		x2=i/10%10;
		x1=i/100%10;
		x4=x3;
		x5=x2;
		x6=x1;
		if((x1+x2+x3+x4+x5+x6)==n)cout<<i<<x4<<x5<<x6<<endl,a=true;
	}
	
	if(a==false)cout<<"-1";
	
	return 0;
}
2020-04-29 17:43:35
请问int的范围不会超过吗
2019-11-19 16:14:28
我优化了你的代码
2018-12-29 23:29:39
#include <stdio.h>
int turn (int num)
{
	int temp=0;
	while(num!=0)
	{
		temp=temp*10+num%10;
		num=num/10;

	}
	return temp;
}

int add (int num)
{
	int sum=0;
	while(num!=0)
	{
		sum=sum+num%10;
		num=num/10;

	}
	return sum;

}

int main()
{
    int i,n;
	int flag=0;
    scanf("%d",&n);
    for(i=10000;i<=999999;i++)
	{
		if(i==turn(i) && n==add(i) )
		{   
			flag=1;
			printf("%6d\n ",i);
		}
	}
	if(flag==0)
	{
		printf("-1\n");
	}

	return 0;
}
2018-12-27 14:14:50
你那个算法须要循环90000次,我这个只需要1998次,论效率上我这个算法最快
2018-12-06 21:27:28
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
	int n,is=0;
	scanf("%d",&n);
	for(int i=1;i<=9;i++){
		for(int j=0;j<=9;j++){
			for(int k=0;k<=9;k++){
				if(2*i+2*j+k==n){
					printf("%d%d%d%d%d\n",i,j,k,j,i);
					is=1;
				}
			}
		}
	}
	for(int i=1;i<=9;i++){
		for(int j=0;j<=9;j++){
			for(int k=0;k<=9;k++){
				if((i+j+k)*2==n){
					printf("%d%d%d%d%d%d\n",i,j,k,k,j,i);
					is=1;
					
				}
			}
		}
	}
	if(!is){
		printf("-1\n");
	}
	return 0;
}
2018-12-06 21:25:08