//考察大数乘法,由于乘数的范围是1-60,直接去乘就行了,注意进位
//使用数组old和new分别记录以前的和新生成的子串,每个数字出现的次数
//11093963 c00h00g 1047 Accepted 388K 0MS G++ 1762B 2012-12-09 19:34:19
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
//乘过之后位数不可能超
char ch[65];
int bignum[65];
//乘以某个数之后的值
int res[65];
//用来表示每个字母出现了多少次
int old[65];
int ne[65];
int len;
//true表示两个字符串相同
bool isSame(){
for(int i=0;i<10;i++){
if(old[i]!=ne[i])
return false;
}
return true;
}
int main(){
while(gets(ch)){
len=strlen(ch);
memset(old,0,sizeof(old));
for(int i=0;i<len;i++){
bignum[i]=ch[i]-'0';
old[ch[i]-'0']++;
}
//计算乘法
int mul,carry,remain;
bool flag=false;
for(int i=2;i<=len;i++){
carry=0;
memset(ne,0,sizeof(ne));
for(int j=len-1;j>=0;j--){
mul=bignum[j]*i;
//余数
remain=mul%10;
int tmp=remain+carry;
if(tmp>=10){
res[j]=tmp%10;
ne[tmp%10]++;
carry=tmp/10;
}else{
res[j]=tmp;
ne[tmp]++;
carry=0;
}
carry+=mul/10;
if(j==0){
if(carry>0){
flag=true;
break;
}
}
}
if(flag)
break;
else{
if(isSame()==false){
flag=true;
break;
}
}
}
if(flag)
printf("%s is not cyclic\n",ch);
else
printf("%s is cyclic\n",ch);
}
return 0;
}
POJ 1047
最新推荐文章于 2017-05-02 18:57:39 发布