1. 程式人生 > 實用技巧 >藍橋杯 演算法訓練:Yaroslav and Algorithm

藍橋杯 演算法訓練: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;
}