sdutoj-3837-素数链表
Description
我們定義素數鏈表為元素全部是素數的鏈表。
給定一個初始含有 n 個元素的鏈表,并給出 q 次刪除操作,對于每次操作,你需要判斷鏈表中指定位置上的元素,如果元素存在且不是素數則刪除。
在所有操作完成后你還需要檢查一下最終鏈表是否是一個素數鏈表。
Input
輸入數據有多組。第 1 行輸入 1 個整數 T (1 <= T <= 25) 表示數據組數。
對于每組數據:
第 1 行輸入 2 個整數 n (1 <= n <= 50000), q (1 <= q <= 1000) 表示鏈表初始元素數量和操作次數
第 2 行輸入 n 個用空格隔開的整數(范圍 [0, 1000])表示初始鏈表
接下來 q 行,每行輸入 1 個整數 i (1 <= i <= 50000),表示試圖刪除鏈表中第 i 個元素
Output
對于每組數據:
先輸出 1 行 “#c”,其中 c 表示當前是第幾組數據
對于每次刪除操作,根據情況輸出 1 行:
如果要刪除的位置不存在元素(位置超出鏈表長度),則輸出 “Invalid Operation”
如果要刪除的位置存在元素且此位置的元素是非素數,則刪除元素并輸出 “Deleted x”,其中 x 為成功刪除的數(必須為非素數才能刪除)
如果要刪除的位置存在元素且此位置的元素是素數,則輸出 “Failed to delete x”,其中 x 為此位置上的數
刪除操作全部進行完畢后,則還需判斷該鏈表現在是否為一個素數鏈表。如果鏈表非空且是素數鏈表,則輸出 “All Completed. It’s a Prime Linked List”,否則輸出 “All Completed. It’s not a Prime Linked List”
所有輸出均不包括引號。
Sample
Input
2
1 2
0
5
1
6 3
1 2 3 3 4 5
1
1
4
Output
#1
Invalid Operation
Deleted 0
All Completed. It’s not a Prime Linked List
#2
Deleted 1
Failed to delete 2
Deleted 4
All Completed. It’s a Prime Linked List
Hint
推薦直接復制粘貼輸出語句字符串到你的代碼中,以防手打敲錯。
鏈表中第 1 個元素的位置為 1,第 2 個元素的位置為 2,以此類推。
/* 這道題題不難,就是基本操作整合到一起,顯得難,你只要把這道題分塊去解決,在注意一下小細節,很容易就A掉。 */ #include<bits/stdc++.h>using namespace std;typedef struct node {int data;struct node *next; } List; int length;List *creat(int n) {List *head, *tail, *p;head = new List;head->next = NULL;tail = head;for(int i = 0; i < n; i++){p = new List;scanf("%d", &p->data);p->next = NULL;tail->next = p;tail = p;}return head;length = n; } int isprim(int a)//判斷素數 {int flag = 1;if(a == 0 || a == 1){flag = 0;}else{for(int i = 2; i <= sqrt(a); i++){if(a % i == 0){flag = 0;break;}}}return flag; }void List_del(List *head, int k)//刪除操作 {List *p, *q;int i;if(k > length)printf("Invalid Operation\n");else{p = head;for(i = 1; i < k; i++){p = p->next;}q = p->next;if(isprim(q->data) == 1)printf("Failed to delete %d\n", q->data);else{printf("Deleted %d\n", q->data);length--;p->next = q->next;free(q);}} }void display(List *head) {if(length == 0)//這里是最容易遺忘的地方,我找了一會才發現!!{printf("All Completed. It's not a Prime Linked List\n");return ;}List *p;int flag = 1;p = head->next;while(p){if(isprim(p->data) == 0){flag = 0;break;}p = p->next;}if(flag == 0)printf("All Completed. It's not a Prime Linked List\n");elseprintf("All Completed. It's a Prime Linked List\n"); } int main() {int T, n, q, k;List *head;while(scanf("%d", &T) != EOF){for(int i = 1; i <= T; i++){printf("#%d\n", i);scanf("%d%d", &n, &q);length = n;head = creat(n);while(q--){scanf("%d", &k);List_del(head, k);}display(head);}}return 0; }總結
以上是生活随笔為你收集整理的sdutoj-3837-素数链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sdut-oj-4205-寻找关键点
- 下一篇: 顺序表应用8:最大子段和之动态规划法