UVA - 1069:Always an integer

Always an integer

来源:UVA

标签:字符串,数论

参考资料:

相似题目:

题目

UVA - 1069:Always an integer_第1张图片

输入

UVA - 1069:Always an integer_第2张图片

输出

这里写图片描述

输入样例

(n^2-n)/2
(2n3+3n2+n)/6
(-n^14-11n+1)/3
.

输出样例

Case 1: Always an integer
Case 2: Always an integer
Case 3: Not always an integer

参考代码

#include
#include
#include
#include
#include
#define MAXL 10005
typedef long long LL;
struct Node{
	int c;//系数
	int e;//阶数
}node[105];

char str[MAXL];
int divi;//除数 
int cnt;//对多项式的项数计数 

void make(char *str){
	char num[12];
	int i=1;
	while(str[i]!=')'){//每次循环 得到一个项 
		int f=1;//默认为+号 
		int c=1;//默认为1 
		int e=0;//默认为0
		if(str[i]=='+'){
			f=1;
			i++;
		}
		if(str[i]=='-'){
			c=f=-1;
			i++;
		}
		if(isdigit(str[i])){
			int j=0;
			while(isdigit(str[i+j])){
				num[j]=str[i+j];
				j++;
			}
			num[j]='\0';
			c=f*atoi(num);
			i=i+j;
		}
		if(str[i]=='n'){
			e=1;
			i++;
		}
		if(str[i]=='^'){
			i++;
		}
		if(isdigit(str[i])){
			int j=0;
			while(isdigit(str[i+j])){
				num[j]=str[i+j];
				j++;
			}
			num[j]='\0';
			e=atoi(num);
			i=i+j;	
		}
		node[cnt].c=c;
		node[cnt].e=e;
		cnt++;
	}  
}

LL pow_mod(LL a, LL p, LL n){
	if(p==0)return 1;
	LL ans=pow_mod(a,p/2,n);
	ans=ans*ans%n;
	if(p%2==1){
		ans=ans*a%n;
	}
	return ans;
}


int main(){
	int T=0;
	while(scanf("%s",str) && str[0]!='.'){
		cnt=0;
		
		divi=atoi(strchr(str,'/')+1);//得到除数
		make(str);//得到多项式的每一项 
		
		int flag=1;
		for(int n=1;n<=node[0].e+1;n++){
			LL sum=0;
			for(int i=0;i<cnt;i++){
				sum=(sum+(node[i].c%divi)*pow_mod(n,node[i].e,divi))%divi;
			}

			if(sum!=0){
				flag=0;
				break;
			}
		}
		
		printf("Case %d: ",++T);
		if(flag){
			printf("Always an integer\n");
		}else{
			printf("Not always an integer\n");
		}
	}
	return 0;
}

你可能感兴趣的:(【记录】算法题解)