東華oj-進階題第90題-循環數

在這裏插入圖片描述

89 分糖果

作者: xxx時間限制: 10S章節: 一維數組

問題描述 :

肖恩和帕特里克是兄弟,他們從他們的父母那裏得到了很多糖果。每一塊糖具有一個正整數的價值,孩子們希望分他們得到的糖果。首先,肖恩將這些糖果分成兩堆,並選擇一堆給帕特里克。然後,帕特里克將嘗試計算每堆的價值,其中每堆的價值是那堆糖果價值的總和,如果他覺得沒有平等的價值,他將開始哭了起來。

不幸的是,帕特里克太小了,所以不能正確的計算。他只會二進制無進位的加法。比如說,他想算12(二進制爲1100)加5(二進制爲101),他會把最右邊的兩位加法算正確,但是第三位會忘記進位。(即0+0=0,0+1=1,1+0=1,1+1=0)

因此,帕特里克算12加5的結果爲9。下面幾個是帕特里克算的結果:

5 + 4 = 1

7 + 9 = 14

50 + 10 = 56

肖恩數學很好,他想得到價值總和更高的糖果並且不讓他的弟弟哭。如果可能,他會分成兩個非空的糖果袋,讓帕特里克認爲,雙方都有相同的值的糖果。給你每一袋糖果每一塊糖果的價值,我們想知道是否可能讓帕特里克相信他們得到糖果價值的總量是相同的。如果可能計算出肖恩能得到的最大的價值。

輸入說明 :

第一行輸入T(1<T<10),表示接下來輸入T組測試數據。

每組測試數據佔一行,每行包含以下數據,N C1 C2 … Cn(其中N(2 ≤ N ≤ 10)代表從父母那裏得到糖果的總數,C(1 ≤ Ci ≤ 100)代表每塊糖果的價值)

輸出說明 :

若不能輸出NO,若能則輸出肖恩得到的最大的價值。

輸入範例 :
2
5 1 2 4 5 8
3 3 5 6
輸出範例 :
NO
11

代碼

/*
	T90 循環數 
*/

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 10

int isLoopingNum(int n);

int main() {
	int M = 0, i = 0;
	
	scanf("%d", &M);
	i = M + 1;
	while (1) {
		if (isLoopingNum(i)) {
			printf("%d\n", i);
			break;
		}
		else 
			i++;
	}
	
	return 0;
} 

// 判斷循環數
int isLoopingNum(int n) {
	int i = 0, j = 0;
	int num = 0;// 前一個被選中的數 
	int temp = 0;
	int count = 0;// 已選的數字個數 
	int digitAmt = 0;// 一個數包含的數字個數 
	int flag[10] = {0};// flag[i]=1表示數字i在某個數的已經出現 
	int stack[MAX_SIZE] = {0};// 保存一個數的各個位 
	
	while (n) {
		if (flag[n % 10] == 1 || n % 10 == 0)// 有重複數字或者有零,不是循環數 
			return 0;
		
		stack[i++] = n % 10;
		flag[n % 10] = 1;// 標記某個數字已經出現 
		n /= 10; 
	} 
	digitAmt = i; 
	
	for (j = 0; j < i / 2; j++) {// 翻轉各位數字 
		temp = stack[j];
		stack[j] = stack[i - j - 1];
		stack[i - j - 1] = temp;
	}
	
	i = 0;
	count++;
	num = stack[i];
	memset(flag, 0, sizeof(flag));// 重置標記 
	flag[num] = 1; 
	while (count < digitAmt) {// 循環取數 
		i = (i + num) % digitAmt;
		count++;
		if (flag[stack[i]] == 1)// 數字已經出現,不是循環數 
			return 0; 
		else {
			num = stack[i];
			flag[num] = 1;// 標記數字 
		}
	}
	if ((i + num) % digitAmt != 0)// 沒有回到起點,不是循環數
		return 0;
	return 1; 
} 

害,感覺我判斷循環數那裏寫的好複雜……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章