zoj 1133 - Smith Numbers

本文详细介绍了在编程过程中避免常见错误的方法,并提供了优化代码效率的有效策略。通过实例分析,读者可以深入理解如何进行有效的程序调试,从而提升软件开发的质量和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* WA了两次 原因是没看清题 题目明确说明 "Wilansky decided later that a (simple and unsophisticated) prime number is not worth being a Smith number " 所以遇到它本身就是素数的情况要跳过 如果你输入4930000它输出的是4930001的话就说明你没有注意到这方面 正确答案是4930137 总体来讲,一道题要想做好一定要有几位清晰的思路,要考虑各种因素 计算机指令在哪个时候应该从哪过都要有一清二楚 如果你写的程序连自己都不知道他该怎么执行那么这道题几乎没有可能AC 还有 本来判断素数想到了打表 由于数据太大所以想到了打一部分 然后小于某个数的查表 大于某个数的再判断 本来想到会超时 结果一提交上去竟然过了 嘿嘿嘿。。。 */ #define LOCAL #include<iostream> #include<cmath> using namespace std; int prime(int n) { int i,t=sqrt(n)+1; if(n==2) return 1; //素数的判断函数竟然写错了,导致跳不出去 for(i=2;i<=t;i++) { if(n%i==0) return 0; } return 1; } int find(int n) { int t,k,sum1,sum2,i; while(1) { n++; if(prime(n)) continue; //遇到素数跳过 sum1=sum2=0; t=k=n; while(k){sum1+=k%10;k/=10;} while(!prime(t)) { i=2; while(!prime(i)||t%i!=0) i++; t=t/i; while(i) {sum2+=i%10;i=i/10;} } while(t){sum2+=t%10;t/=10;} if(sum1==sum2) return n; } } int main() { #ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int n; while(cin>>n&&n) cout<<find(n)<<endl; return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值