题目1183:守形数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:6514
解决:3343
-
题目描述:
-
守形数是这样一种整数,它的平方的低位部分等于它本身。
比如25的平方是625,低位部分是25,因此25是一个守形数。
编一个程序,判断N是否为守形数。
-
输入:
-
输入包括1个整数N,2<=N<100。
-
输出:
-
可能有多组测试数据,对于每组数据,
输出"Yes!”表示N是守形数。
输出"No!”表示N不是守形数。
-
样例输入:
-
25 4
-
样例输出:
-
Yes! No!
-
来源:
- 2002年华中科技大学计算机研究生机试真题
- 这道题乍一看很简单,实际也不难。。但却真的坑了我好久!。只怪自己太年轻。唉~先晒出正确AC的代码:
-
#include <cstdio> #include <cmath> using namespace std; int main() { int n; while(scanf("%d",&n)!=EOF){ int m=n*n,flag=0; while(n!=0){ if(n%10!=m%10){ flag=1; break; } else{ n/=10;m/=10; if(n==0) break; } } if(flag) printf("No!\n"); else printf("Yes!\n"); } return 0; }
用余数做,从后往前依次比较n和m的每一位,如遇不同,那肯定不是守位数,跳出,No;如果一直到n为0了对应位都相同,那就是了。我出错的关键之处在于没有正确理解“低位部分”的意思,我以为是除了最高位 的所有位都算低位。。。实际上人家的意思是n是不是m尾数,没有规定究竟是低几位。事实上,由于n的范围:<100,计算m的个位和十位也就够了,这也就是为什么下面的代码一直WA: -
而改成这样就AC了的原因:#include <cstdio> #include <cmath> using namespace std; int main() { int n; while(scanf("%d",&n)!=EOF){ int buf[9]={0},m=n*n; int i,j; for(i=0;m!=0;i++){ buf[i]=m%10; m/=10; } int s=0; if(i==1) printf("%s\n",buf[0]==n?"Yes!":"No!"); else{ for(j=0;j<i-1;j++){ s+=buf[j]*pow(10,j); } printf("%s\n",s==n?"Yes!":"No!"); } } return 0; }
-
#include <cstdio> #include <cmath> using namespace std; int main() { int n; while (~scanf("%d", &n)) { int buf[9] = { 0 }, m = n*n; int i, j; for (i = 0; m != 0; i++) { buf[i] = m % 10; m /= 10; } int s = 0; if (n < 10) i = 1; else i = 2; if (i == 1) printf("%s\n", buf[0] == n ? "Yes!" : "No!"); else { for (j = 0; j < i; j++) { s += buf[j] * pow(10, j); } printf("%s\n", s == n ? "Yes!" : "No!"); } } return 0; }
后者对i进行了分类赋值,不是1就是2,不用再往高位看了.... - ****************************************************************************
- 由这道题明白了审清题意的重要性,在这里要感谢南京邮电大学ACM校队的张帅教练,是他帮我指出了错误。同时,也明白了用余数处理的方便之处,不必考虑要用m的低几位,等到n被除没了,自然比较也结束了!
- ************************************************************************************************
- 坚持,而不是打鸡血~