解题思路:刚来这个网站不久,看了前辈们写的题解,感觉有点沉长,题目种说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; }
能不能解释t>0这个怎么退出来? 谢谢
咖啡 2020-06-24 22:50:33 |
t等于0时就可以鸭
克里斯帮我把AW的门 2020-08-28 10:18:00 |
因为while循环里面有个t/=10,所以进行到一定程度t一定会等于0
5043张亚 2022-03-01 16:15:59 |
最后t=1 t=t/10=0 就出循环了
#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; }
#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; }
你那个算法须要循环90000次,我这个只需要1998次,论效率上我这个算法最快
#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-29 23:19:01 |
我的算法时间效率更高
浅滩 2018-12-29 23:19:13 |
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int n,flag=0,i,j,k; scanf("%d",&n); for(i=1;i<=9;i++)//回文数是5位的情况 { for(j=0;j<=9;j++) { for(k=n-2*i-2*j;(k>=0&&k<10);) { printf("%d%d%d%d%d\n",i,j,k,j,i); flag=1; break; } } } for(i=1;i<=9;i++)//回文数是6位的情况 { for(j=0;j<=9;j++) { for(k=n-2*i-2*j;((k%2==0&&k/2<10)&&k/2>=0);) { printf("%d%d%d%d%d%d\n",i,j,k/2,k/2,j,i); flag=1; break; } } } if(flag==0) printf("-1\n"); }
浅滩 2018-12-29 23:20:15 |
只用进行180次
望尽天涯路 2019-04-25 18:22:39 |
@bob2048 你这是优化而已,嗯。。。直接在循环的过程中考虑回文条件加以限制,减少循环的次数,不错的想法,但是本质上两者差不多!!
lpppp 2021-03-15 17:58:37 |
最里面可以用if吧
A+B for Input-Output Practice (V) (C语言代码)浏览:487 |
人见人爱A+B (C语言代码)浏览:1046 |
C语言程序设计教程(第三版)课后习题7.4 (Java代码)浏览:874 |
川哥的吩咐 (C++代码)浏览:1084 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:777 |
数列排序 (C语言代码)浏览:860 |
C语言程序设计教程(第三版)课后习题9.2 (Java代码)浏览:697 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:702 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:949 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:1292 |