藍橋杯 演算法訓練:Yaroslav and Algorithm
題目描述:網路流裸題
問題描述
(這道題的資料和SPJ已完工,盡情來虐吧!)
Yaroslav喜歡演算法。我們將描述一個他最喜歡的演算法。
1.這個演算法接受一個字串作為輸入。我們設這個輸入字串為a。
2.這個演算法由一些命令組成。i號命令的形式為"s[i]>>w[i]"或"s[i]<>w[i]",其中s[i]和w[i]是長度不超過7的字串(可以為空),由數字或字元"?"組成。
3.這個演算法每次尋找一個編號最小的命令i,使得s[i]是a的子串。如果沒有找到這樣的命令,那麼整個演算法終止。
4.設找到的命令編號為k。在字串a中,s[k]第一次出現的位置會被w[k]替換。如果這個命令形如"s[k]>>w[k]",那麼這個演算法繼續執行(譯註:回到第3步)。否則,演算法終止。
5.演算法的輸出就是演算法終止時字串a的值。
Yaroslav有一個n個正整數的集合,他需要一個這樣的演算法,且能夠使每一個數加1。更正式地,如果我們把每個數看成一個十進位制表示的字串,那麼對於每個字串獨立地執行這個演算法,這個演算法需要輸出一個輸入串對應的數+1的字串。
幫幫他吧!
輸入格式
第一行包含一個整數n(集合中數的個數),接下來n行,每行包含一個正整數。
輸出格式
輸出一個符合題意的演算法(能夠分別將每個數增加1)。第i行輸出這個演算法的第i個命令,不包含空格。
你的演算法將會對於每個輸入執行一遍。你的輸出會被認為是正確的,當且僅當:
·每行都是一個合法的命令(格式見題目描述)
·命令的條數不能超過50。
·演算法需要對每個給出的數+1。
·為了得到結果,演算法必須對於每個輸入都執行不超過200步。
樣例輸入
2
10
79
樣例輸出
10<>11
79<>80
資料規模和約定
1≤每個數≤10^25。共有20個測試點,對於第i個測試點,n=5i。
思路
一開始看這道題的時候,懵逼了,他這說的什麼???我怎麼看不懂題意????
然後看了一下案例,再仔細琢磨了一下,發現他只要你把他給的數+1就行了,就行了,就行了
但是,那個數超過了longlong,所以得用string存。
其實說白了就是一個超級超級簡單的大數運算(只是+1)
程式碼
// 試題 演算法訓練 Yaroslav and Algorithm // 大數運算 簡單的+1 #include <iostream> #include <cstdio> using namespace std; typedef long long ll; string a, b; int main() { int n; scanf("%d", &n); while (n--) { cin >> a; b = a; int len = a.length() - 1; int c = (int)a[len] - '0' + 1; while (c > 9 && len > 0) { a[len] = c % 10 + '0'; len--; c = c / 10 + (int)a[len] - '0'; } a[len] = c%10+'0'; if(c>9) a = "1"+a; cout<<b<<"<>"<<a<<endl; } return 0; }