程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA 1069 - Always an integer(數論)

UVA 1069 - Always an integer(數論)

編輯:C++入門知識

1069 - Always an integer


題意:給定一個多項式,判斷是否總是整數
思路:LRJ大白上的例題,上面給出了證明,只要1到k + 1(k為最高次數)帶入方程都是整數,那麼整個方程就是整數,處理出字符串後,然後過程用快速冪計算,判斷最後答案是否為0,看是否全都滿足是整數。
代碼:
#include 
#include 
#include 
using namespace std;

char str[105];

struct X {
	long long a, k;
} x[105];

long long mu, Max;
int xn;

void build() {
	mu = Max = 0; xn = 0;
	long long s = 0, a = 0, flag = 1, k = 0;
	int len = strlen(str);
	for (int i = 0; i < len; i++) {
		if (str[i] >= '0' && str[i] <= '9') {
			if (s == 0) a = a * 10 + str[i] - '0';
			if (s == 1) k = k * 10 + str[i] - '0';
			if (s == 2) mu = mu * 10 + str[i] - '0';
  		}
  		else if (str[i] == 'n')
  			s = 1;
		else if (str[i] == '/')
			s = 2;
		else if (str[i] == '+' || str[i] == '-' || str[i] == ')') {
			if (s >= 1) {
				if (a == 0) a = 1;
				if (k == 0) k = 1;
   			}
   			Max = max(Max, k);
   			x[xn].a = a * flag; x[xn].k = k; xn++;
   			if (str[i] == '-') flag = -1;
   			else if (str[i] == '+') flag = 1;
   			a = k = s = 0;
  		}
 	}
}

long long pow_mod(long long x, long long k) {
	long long ans = 1;
	while (k) {
		if (k&1) ans = ans * x % mu;
  		x = x * x % mu;
  		k >>= 1;
 	}
 	return ans;
}

bool judge() {
	for (long long i = 0; i <= Max + 1; i++) {
		long long ans = 0;
  		for (int j = 0; j < xn; j++) {
			ans = (ans + x[j].a * pow_mod(i, x[j].k)) % mu;
  		}
  		if (ans) return false;
 	}
 	return true;
}

int main() {
	int cas = 0;
	while (~scanf("%s", str) && str[0] != '.') {
		build();
		printf("Case %d: %s\n", ++cas, judge()?"Always an integer":"Not always an integer");
 	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved