书 P123
用的书中方法。
代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int a[105];
typedef long long LL;
int getx(char *s,int l,int r)
{
int i,ret=0;
for(i=l;i<=r;i++)
ret=ret*10+s[i]-'0';
return ret;
}
void fun(char *s,int flag,int l,int r)
{
int i,j,wei,xi;
// printf("l=%d r=%d\n",l,r);
for(i=l;s[i]!='n' && i<=r;i++); //寻找 'n'的位置
// printf("i=%d\n",i);
if(i>r) {a[0]=flag*getx(s,l,r);return; } //表示 无'n'
if(i==l) xi=1;
else xi=getx(s,l,i-1);
if(s[i+1]!='^') wei=1;
else wei=getx(s,i+2,r);
// printf("wei=%d\n",wei);
a[wei]=xi*flag;
}
int main()
{
int i,j;
char s[50005];
int d,pre,ne,k,ok,n,ncase=0;
int flag; //判断符号正负
while(~scanf("%s",s))
{
int len=strlen(s);
if(len<=1) break;
printf("Case %d: ",++ncase);
memset(a,0,sizeof(a));
i=0;
pre=0; flag=1;
while(i<len)
{
for(ne=i;(s[ne]!='+' && s[ne]!='-' && s[ne]!=')');ne++);
// printf("*pre=%d ne=%d\n",pre,ne);
if(ne-pre>=2) fun(s,flag,pre+1,ne-1);
if(s[ne]==')') { d=getx(s,ne+2,len-1); break;}
if(s[ne]=='+') flag=1;
else if(s[ne]=='-') flag=-1;
pre=ne; i=ne+1;
}
k=100;
while(a[k]==0)
{
k--;
}
// printf("k=%d\n",k);
// for(i=k;i>=0;i--)
// printf("%d: %d\n",i,a[i]);
//printf("d=%d\n",d);
ok=1;
for(n=1;n<=k+1;n++)
{
LL x=0;
for(j=k;j>=1;j--)
x=(x+a[j])*n%d; //开始这个地方没取模,可能会数字越界! wr一次!!
x=(x+a[0])%d;
if(x%d!=0) {ok=0;break;}
}
if(!ok) printf("Not always an integer\n");
else printf("Always an integer\n");
}
return 0;
}