【Code Pratice】—— 等差素数列、错误票据、神奇算式
文章目錄
- 1 | 等差素數列
- 題目
- 思路
- 邏輯代碼
- 2 | 錯誤票據
- 題目
- 思路
- 邏輯代碼
- 3 | 神奇算式
- 題目
- 思路
- 邏輯代碼
1 | 等差素數列
題目
2,3,5,7,11,13,…是素數序列。
類似:7,37,67,97,127,157 這樣完全由素數組成的等差數列,叫等差素數數列。
上邊的數列公差為30,長度為6。
2004年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。
這是數論領域一項驚人的成果!
有這一理論為基礎,請你借助手中的計算機,滿懷信心地搜索:
長度為10的等差素數列,其公差最小值是多少?
思路
抓住題目的兩個關鍵點:1. 等差數列,2. 素數
思路大概如下
邏輯代碼
int ArithmeticPrimeSequence(int i_uNum) {if (0 > i_uNum){return 0;}vector<int> res;int ComRatioMin = 1;for (int i = 1; i < 1000; i++){for (int j = 2; j < 10000; j++){if (IsPrimeNum(j)){int tmp = j;res.push_back(tmp);for (int k = 1; k < i_uNum; k++){tmp += i;if (IsPrimeNum(tmp)){res.push_back(tmp);}else{res.clear();break;}}}if (i_uNum == res.size()){ComRatioMin = i;break;}}if (i_uNum == res.size()){ComRatioMin = i;break;}}cout << "The minimum common ratio = [" << ComRatioMin << "]." << endl;cout << "Result sequence: [";for (int i = 0; i < res.size(); i++){if (i == res.size() - 1){cout << res[i] << "]." << endl;}else{cout << res[i] << " ";}}return 1; }2 | 錯誤票據
題目
某涉密單位下發了某種票據,并要在年終全部收回。
每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。
因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。
你的任務是通過編程,找出斷號的ID和重號的ID。
假設斷號不可能發生在最大和最小號。
輸入格式
要求程序首先輸入一個整數N(N<100)表示后面數據行數。
接著讀入N行數據。
每行數據長度不等,是用空格分開的若干個(不大于100個)正整數(不大于100000),以-1結束每行輸入
每個整數代表一個ID號。
輸出格式
要求程序輸出1行,含兩個整數m n,用空格分隔。
其中,m表示斷號ID,n表示重號ID
樣例
輸入1
2
5 6 8 11 9
10 12 9
輸出1
7 9
輸入2
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196 -1
172 189 127 107 112 192 103 131 133 169 158 -1
128 102 110 148 139 157 140 195 197 -1
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190 -1
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188 -1
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119 -1
輸出2
105 120
思路
邏輯代碼
void WrongTicket(int i_uNum) {vector<int> res;int BrokenNum = 0;int RepeatNum = 0;for (int i = 0; i < i_uNum; i++){int tmp = 0;while (tmp != -1){cin >> tmp;res.push_back(tmp);}}ort(res, true);for (int i = 0; i < res.size() - 1; i++){if (res[i] == res[i + 1]){RepeatNum = res[i];}if ((res[i] != (res[i + 1] - 1)) && (res[i] != res[i + 1])){BrokenNum = res[i] + 1;}}cout << "Broken number = [" << BrokenNum << "]" << endl;cout << "Repeat number = [" << RepeatNum << "]" << endl; }3 | 神奇算式
題目
由4個不同的數字,組成的一個乘法算式,它們的乘積仍然由這4個數字組成。
比如:
都符合要求。
如果滿足乘法交換律的算式算作同一種情況,那么,包含上邊已列出的3種情況,一共有多少種滿足要求的算式
思路
神奇算式有兩個關鍵點
大概思路如下:
確定兩個乘數的范圍
記錄下兩個數的數值,以及各個位的數字,并判斷這兩個數是否符合要求
怎么記錄各個位的數值?
定義一個10長度的數組,如果0~9剛好對應各個數字,如果出現對應數字,數組對應位加一即可
判斷乘積是否符合要求
怎么對比乘積的四位數與乘數的四位數是否相同?
通過使用上面定義的數組,獲取該乘積的每一位,對應位的數值減一,如果最后數組中出現-1值,或非全0值,則證明四位數不相同
排除干擾項
什么是干擾項?
如下列兩個式子看起來都是神奇算式
30 * 51 = 1530
51 * 30 = 1530
這兩個式子實際上屬于同一個神奇算式,只是兩個乘數位置對調了,如果不排除這個類型的式子的話,就會導致得到的結果存在多個重復項
怎么排除?
只需要判斷當前的兩個乘數是否存在于前面存下來的數組中即可
邏輯代碼
int MagicFormula() {vector<int> num(10, 0);vector<pair<int, int>> Mult;int res = 0;int min1 = 0;int max1 = 0; int min2 = 0;int max2 = 0; for (int i = 1; i <= 2; i++){if (1 == i){min1 = 1;max1 = 9;min2 = 123;max2 = 987;}else{min1 = 12;max1 = 98;min2 = 12;max2 = 98;}for (int j = min1; j <= max1; j++){for (int k = min2; k <= max2; k++){int sum = 0;if (IsValidMultiplier(j, k, num)){sum = j * k;int tmp = sum;while (tmp){num[tmp % 10]--;tmp /= 10;}int cnt = count(num.begin(), num.end(), 0);if (10 == cnt){int cnt1 = count(Mult.begin(), Mult.end(), pair<int, int>(j, k));int cnt2 = count(Mult.begin(), Mult.end(), pair<int, int>(k, j));if (0 == cnt1 && 0 == cnt2){Mult.emplace_back(j, k);cout << j << " * " << k << " = " << sum << endl;res++;}}}fill(num.begin(), num.end(), 0);}}}return res; }總結
以上是生活随笔為你收集整理的【Code Pratice】—— 等差素数列、错误票据、神奇算式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android仿直播特效之刷礼物
- 下一篇: HBuilder 模拟器端口号