在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1 #include<stdio.h> 2 #include <string.h> 3 #define MAX_LEN 60 4 5 unsigned aNum[MAX_LEN+10];//存放倒过来的大数,从低位开始相乘 6 unsigned aRes[MAX_LEN+10];//存放相乘后的大数 7 unsigned aFlag[MAX_LEN+10];// 看是否匹配 8 9 int main() 10 { 11 char sNum[MAX_LEN+10]; 12 int nLen; 13 int i,j,k; 14 while (~scanf("%s",&sNum))//刚开始一直Output Limit Exceeded,提交了好几次,原来是这里不加~会死循环,但换成C++的cin可以,它包括ctrl+z结束符 15 { 16 int f = 1; 17 nLen = strlen(sNum); 18 j = 0; 19 for (i = nLen-1; i >= 0; i--)//将大数倒过来 20 aNum[j++] = sNum[i] - '0'; 21 for (i = 2; i <= nLen; i++)//乘以2->n 22 { 23 memset(aRes, 0, sizeof(aRes)); 24 for (j=0;j<=nLen-1;j++)//相乘 25 aRes[j] = aNum[j] * i; 26 for (j = 0; j <=nLen-1; j++)//统一进位 27 { 28 if (aRes[j] >= 10) 29 { 30 aRes[j+1] += aRes[j] / 10; 31 aRes[j] %= 10; 32 } 33 } 34 memset(aFlag, 0, sizeof(aFlag)); 35 for (j = 0; j < nLen; j++)//相乘之后的大数与原来的数进行匹配,看是否匹配 36 { 37 unsigned tmp = aRes[j]; 38 k = 0; 39 while (k < nLen) 40 { 41 if (aNum[k]==tmp && aFlag[k]==0)//如果对应匹配,而且当前位未曾匹配过,此过程是从原来的大数里从k=0,k++,对应查找相乘得到的大数, 42 { 43 aFlag[k] = 1;//标记,表示已经匹配过 44 break; 45 } 46 k++; 47 } 48 if (k >= nLen)//表示未匹配成功 49 { 50 f = 0; 51 break; 52 } 53 } 54 if (f == 0) 55 { 56 printf("%s is not cyclic\n",sNum); 57 break; 58 } 59 } 60 if (f == 1) 61 printf("%s is cyclic\n",sNum); 62 } 63 return 0; 64 } |
请发表评论