Kaprekar数
来源:互联网 发布:pk10网站源码 编辑:程序博客网 时间:2024/06/07 03:44
Description
一个Kaprekar数(雷劈数,或卡普利加数)是个非负整数,将它的平方分成两部分,这两部分之和正好是原来的数字。例如,297是一个Kaprekar 数:297² = 88209, 88 + 209 = 297. 在这里,平方分成的第二部分可以从0开始,但不能是负数。例如, 999是一个Kaprekar 数:999² = 998001, 998 + 001 = 999;但100不是:100² = 10000,100 + 00 = 100, 其中第二部分为0了.
在数学上,假设X是一个非负整数。在十进制计数中,X是一个Kaprekar 数,当且仅当存在非负整数n, A, 和整数B满足下列三个条件::
0 < B <10n
X² = A10n + B
X = A + B
在十进制计数中,常见的Kaprekar数有:
1, 9, 45, 55, 99, 297, 703
- Input
输入包含多个测试用例(不超过100)。每个测试用例包括一行。给出一个整数 (位数不超过1000)。一行“0”表示所有输入结束,无需处理此例。
- Output
对于每个测试用例,输出一行,依次包含:
l “Case #: ”,#表示序号
l 如果测试用例中的数为Kaprekar数,则输出Yes,否则输出No
- Sample Input
999
101
4879
0
- Sample Output
Case 1: Yes
Case 2: No
Case 3: Yes
#include<iostream>#include<string>using namespace std;#define N 1010void Mul(char *str1,char *str2,char *str3){ int i,j,i1,i2,tmp,carry,jj; int len1=strlen(str1),len2=strlen(str2); char ch; jj=carry=0; for(i1=len1-1;i1>=0;--i1){ j=jj; for(i2=len2-1;i2>=0;--i2,++j){ tmp=(str3[j]-'0')+(str1[i1]-'0')*(str2[i2]-'0')+carry; if(tmp>9){ carry=tmp/10;str3[j]=tmp%10+'0'; } else{ str3[j]=tmp+'0';carry=0; } } if(carry){ str3[j]=carry+'0';carry=0;++j; } ++jj; } --j; while(str3[j]=='0'&&j>0)--j; str3[++j]=0; for(i=0,--j;i<j;++i,--j){ ch=str3[i];str3[i]=str3[j];str3[j]=ch; }}void Add(char *str1,char *str2,char *str3){ int i,j,i1,i2,tmp,carry; int len1=strlen(str1),len2=strlen(str2); char ch; i1=len1-1;i2=len2-1; j=carry=0; for(;i1>=0&&i2>=0;++j,--i1,--i2){ tmp=str1[i1]-'0'+str2[i2]-'0'+carry; carry=tmp/10; str3[j]=tmp%10+'0'; } while(i1>=0){ tmp = str1[i1--]-'0'+carry; carry=tmp/10; str3[j++]=tmp%10+'0'; } while(i2>=0){ tmp=str2[i2--]-'0'+carry; carry=tmp/10; str3[j++]=tmp%10+'0'; } if(carry)str3[j++]=carry+'0'; str3[j]=0; for(i=0,--j;i<j;++i,--j){ ch=str3[i];str3[i]=str3[j];str3[j]=ch; }}int main(){ //freopen("in.txt","r",stdin); char str1[N],str2[2*N],temp[N],sum[N]; int times=0; while(scanf("%s",str1)!=EOF) { getchar(); int i,j,k,ok=0; if(strcmp(str1,"0")==0)break; printf("Case %d: ",++times); memset(str2,'0',sizeof(str2)); memset(temp,'0',sizeof(temp)); Mul(str1,str1,str2); int len=strlen(str2); i=0; if(len>=10) i=len/2-6; for(;i<=len/2+2;i++) { memset(sum,'0',sizeof(sum)); for(j=0;j<=i;j++) temp[j]=str2[j]; temp[j]=0; for(k=i;k<len && str2[k]=='0';k++); if(k==len)continue; Add(temp,str2+j,sum); for(j=0;sum[j]=='0';j++); if(strcmp(sum+j,str1)==0) { ok=1; break; } } if(ok) printf("Yes\n"); else printf("No\n"); } return 0;}
0 0
- Kaprekar数
- 南邮 OJ 1598 Kaprekar数
- UVa 974 - Kaprekar Numbers
- Kaprekar常数问题
- kaprekar常数(6174猜想)
- 数
- 数
- 数
- 数
- 数
- 数
- 字符数,字节数
- 完全数、亲和数
- 字符数、字节数
- 亲和数、相亲数
- 整形数,浮点数
- 浮点数、定点数
- 三角数因子数
- android EditText默认问题
- win8.1下无法运行vc++6.0的解决方法
- 关于CentOS网络连接问题及第三天实习收获
- python中的input函数和raw_input函数的区别
- 二叉树的前序、中序、后序、层序遍历
- Kaprekar数
- Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二
- MySQL存储引擎总结
- HQL和SQL的区别
- Java 内存分配全面浅析
- android LayoutInflater 的使用
- QTreeWidget样式设置大全(一)
- js 写一个table
- iOS 8 自适应 Cell