原题链接:蓝桥杯算法提高VIP-五次方数
本来我的题目是从1开始的数据,这样比现在这个答案要多出一个1数据作为答案(1的5次方=1)
但是发现这样错了
范围的推理过程如下:
上边界:
以单位数最大值9为边界,9^5=59049 是五位数字,
那么5位数字增加一位为添加任何数据的极限,即 5*(9^5)=295245(即每一位都是9,当然数据是达不到的)而这样一个极限的数据是6位数,我为了编写方便,可以直接写一个最大的六位数999999(当然你也可以按照推理数据写295249),超过6位数已经不会产生数据了,这就是上边界。
下边界:
本来我是从个位数开始计算的,这样计算可以有两个数据,0和1,0的五次方为0,1的五次方为1,但可惜本题的正确答案并不包含这两个数据,那么既然错了之后,可以发现数据其实从2位数开始也未尝不可,找到几个详细的数据之后又可以发现,大概在4位数的时候,出现了一个数据的平衡点,所以可以拿4作为边界,这需要有一定的数据敏感性,建议还是老实使用10作为下边界吧。
代码:
#include<stdio.h>
#include<math.h>
int main() {
for(int i=1000; i<=999999; i++) {
int t1=i%10,t2=i/10%10,t3=i/100%10,t4=i/1000%10,t5=i/10000%10,t6=i/100000;//分别是个,十,白,千,万,十万位
if(pow(t1,5)+pow(t2,5)+pow(t3,5)+pow(t4,5)+pow(t5,5)+pow(t6,5)==i)
printf("%d\n",i);
}//判断一下五次方数从4位开始,6位结束,或多或少(1除外)均不可能产生五次方数字
return 0;
}最终答案如此
4150
4151
54748
92727
93084
194979
可以直接用C++的大R输出法快速解决:(直接输出)
cout<<R"(4150 4151 54748 92727 93084 194979)"<<endl;
就可以了。
0.0分
10 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
@坚果吞噬者 #include<stdio.h> int main() { int a;//需要寻找的数字 int b;//存放a拆解出来的数字 int c=0;//存放拆解出来数字的五次方和 int t;//代替a进行分解,保持a的不变 for(a=0;a<999999;a++) { t=a; while(t>0) { b=t%10; c+=b*b*b*b*b; t/=10; } if(c==a) { printf("%d是这种数 ",a); } c=0; } return 0; }我想问一下为什么我这数组的赋值有问题 #include<stdio.h> #define max(x) x*x*x*x*x int main() { int i,j; int shu[10]; for(i = 0 ; i < 1000000 ; i++){ for(j = 0 ; j < 10 ; j++){//让存数的数组每位都为0 shu[j]=0; } int b=i;//保存一下i的数值 j=0; while(b != 0){ if(b < 10){//当数小于10时,直接存储之后break结束 shu[j]=b; break; } shu[j++]=b%10; b=b%10; } int sum=0; for(j = 0 ; j < 10 ; j++){//让每个数都乘5次方 sum+=max(shu[j]); } if(i == sum){//如果总和与i相等,输出结果 printf("%d\n", sum); } } return 0; }