<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      day05:枚舉&模擬&高精度(了解原理,實現高精加)&文件重定向

      day05:枚舉&模擬&高精度(了解原理,實現高精加)&文件重定向

      枚舉,其實就是窮舉,把所有答案都遍歷一遍,看是否滿足要求

      模擬:這個怎么說呢?其實就是讓你干什么,你就干什么,按照它的要求來就是了。

      對于枚舉和模擬的題目主要是通過練題,提升自己的代碼量來鞏固,沒有太多的知識點。

      高精度

      一個十分經典的問題:輸入a b,求a+b的和
      普通的話我們直接cout<<a+b就可以了,但是如果告訴你:

      a,b是兩個有100位長度的數據呢?這明顯就不行了啊!
      即使unsigned long long 的最大值也不過2^64=1.8e19

      這就需要使用高精算法了,一般這類算法考的比較少,但是這樣有趣的知識點,我們還是學習一下吧!

      算法介紹

        a = 11111111
        b = 22222222
      a+b = 33333333
      
        a = 8888,8888
        b = 9999,9999
      a+b = 17 17 17 17, 17 17 17 17 (每位對應求和)
          = 17 17 17 17, 17 17 18  7 (開始進位)
          = 17 17 17 17, 17 18  8  7 (繼續進位)
          = 17 17 17 17, 18  8  8  7 (繼續進位)
          = 17 17 17 18,  8  8  8  7 (繼續進位)
          = 17 17 17 18,  8  8  8  7 (繼續進位)
          = 17 17 18  8,  8  8  8  7 (繼續進位)
          = 17 18  8  8,  8  8  8  7 (繼續進位)
          = 18  8  8  8,  8  8  8  7 (繼續進位)
        = 1, 8  8  8  8,  8  8  8  7 (進位結束)
      

      這就是高精度加法的原理,但是我們發現每次進位都是從后向前,
      于是可以直接將數據翻轉過來處理,最后輸出或返回時在逆序即可。

      以下為高精加法的實現

      #include <iostream>
      #include <string>
      #include <algorithm>
      using namespace std;
      
      //注意開全局變量,如果是局部變量很容易出現問題
      const int MAXN=10005;
      int A[MAXN],B[MAXN],C[MAXN], Ans[MAXN],Len_A,Len_B,Len_Ans;
      
      void Read(int A[],int &Len) {
          string cur;    cin>>cur;
          Len=cur.length();
          for(int i=0; i<Len; i++) A[i] = cur[i]-'0';
          reverse(A,A+Len);//對A[0]..A[Len]進行翻轉
      }
      int main() {
          Read(A,Len_A);    Read(B,Len_B);
          Len_Ans=max(Len_A,Len_B);
          for(int i=0; i<=Len_Ans; i++) {
              Ans[i]=A[i]+B[i]+C[i];    //加上前一位的進位值
              if(Ans[i]>9) C[i+1]=Ans[i]/10, Ans[i]-=10;//處理進位值
          }
          while(Ans[Len_Ans]>0) Len_Ans++; //位數是否增加
          for(int i=Len_Ans-1; i>=0; i--)    cout<<Ans[i];//輸出結果 
          return 0;
      }//該高精模板源自CCF教材
      

      以下為高精減法的實現

      #include <iostream>
      #include <string>
      #include <algorithm>
      using namespace std;
      
      const int MAXN=10005;
      int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
      
      void Read(int A[],int &Len) {
          string cur;    cin>>cur;
          Len=cur.length();
          for(int i=0; i<Len; i++) A[i] = cur[i]-'0';
          reverse(A,A+Len);//對A[0]..A[Len]進行翻轉
      }
      
      int main() {
          Read(A,Len_A);	Read(B,Len_B);
          Len_Ans=max(Len_A,Len_B);
          for(int i=0; i<=Len_Ans; i++) {
              Ans[i]=A[i]-B[i]-C[i];
              if(Ans[i]<0) C[i+1]++,Ans[i]+=10; //借位操作
          }
          while(Len_Ans>1&&Ans[Len_Ans-1]==0) Len_Ans--; //位數是否減少
          for(int i=Len_Ans-1; i>=0; i--) cout<<Ans[i];  //輸出結果 
          return 0;
      }//該高精模板源自CCF教材
      

      以下為高精乘法的實現

      #include <iostream>
      #include <string>
      #include <algorithm>
      using namespace std;
      
      const int MAXN=10005;
      int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
      
      void Read(int A[],int &Len) {
          string cur;	cin>>cur;
          Len=cur.length();
          for(int i=0; i<Len; i++) A[i] = cur[i]-'0';
          reverse(A,A+Len);
      }
      
      int main() {
          Read(A,Len_A);    Read(B,Len_B);
          Len_Ans=Len_A+Len_B-1;
          for(int i=0; i<=Len_A; i++)
              for(int j=0; j<=Len_B; j++)
                  Ans[i+j]+=A[i]*B[j];
          for(int i=0; i<Len_Ans; i++)
              if(Ans[i]>9) {
                  Ans[i+1]+=Ans[i]/10;
                  Ans[i]%=10;
              }//最后進行進位處理
          while(Ans[Len_Ans]) Len_Ans++;
          for(int i=Len_Ans-1; i>=0; i--) cout<<Ans[i];
          return 0;
      }//該高精模板源自CCF教材
      

      以下為高精除法的實現

      #include <iostream>
      #include <string>
      #include <algorithm>
      using namespace std;
      
      const int MAXN=10005;
      int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
      
      void Read(int A[]) {
          string cur;	cin>>cur;
          A[0]=cur.length();
          for(int i=1; i<=A[0]; i++)    A[i] = cur[i-1]-'0';
          reverse(A+1,A+A[0]+1);
      }
      
      bool Big(){//比較余數C與除數B的大小,如果C>=B返回True,否則返回false
          if(C[0]>B[0]) return true;
          if(C[0]<B[0]) return false;
          for(int i=C[0]; i>=1; i--)
              if(C[i]<B[i])return false;
              else if(C[i]>B[i]) return true;
          return true;
      }
      
      void Minus() {//從C中減去B
          int c=0;
          for(int i=1; i<=C[0]; i++) {
              C[i]-=B[i]+c;
              if(C[i]<0) C[i]+=10, c=1;
              else c=0;
          }
          while(C[0]>1&&C[C[0]]==0) C[0]--;
      }
      
      void output(int A[]) {
          for(int i=A[0]; i>=1; i--)
              cout<<A[i];
          cout<<endl;
      }
      
      int main() {
          Read(A); Read(B);
          C[0]=0;
          for(int i=A[0]; i>=1; i--) {
              for(int j=C[0]; j>=1; j--) C[j+1]=C[j];
              C[1]=A[i];
              C[0]++;
              while(Big()) {
                  Minus();
                  Ans[i]++;
              }
          }
          Ans[0]=A[0];
          while(Ans[0]>1&&Ans[Ans[0]]==0) Ans[0]--;
          output(Ans);
          output(C);
          return 0;
      }//該高精模板源自CCF教材
      

      高精加減乘的實現原理是大同小異的,高精除法需要轉化使用減法的方式比較麻煩,但是很少考到這個,建議就是如果有時間可以將高精加減乘按照自己的風格寫一遍。

      另外注意一點:部分同學喜歡將計算結果返回為string類型,當然筆者也喜歡這樣!
      可是在string使用是會用到str.append()的用法,而這樣的用法是在C11版本才有的,如果不支持C11那么這樣的寫法是不能AC的,比如:提交奧賽一本通的網站就會出bug

      文件重定向

      這個其實主要對于數據測試和競賽中有用,平常用不上,但是比賽又必須要使用

      freopen("輸入文件名", "r", stdin); //替代我們的手動輸入,將文件中內容讀入輸入流中
      freopen("輸出文件名", "w", stdout);//將輸出流中的數據寫入文件中
      
      //正常的執行程序
      
      fclose(stdin);  //關閉輸入流
      fclose(stdout); //關閉輸出流
      

      在 windows 系統上可以不寫fclose,系統會自動關閉,
      但是 Linux 系統上如果不寫會出現問題,無法正常關閉或文件保存出現問題,保險起見,還是寫上。

      其實用這個來代替我們的手動輸入是比較方便的,大家可以多習慣這樣的用法。

      舉例:【題目描述】輸入a,b, 輸出a+b的結果(0<=a, b<=2^31)。

      題目 a+b
      提交源文件名 ab.cpp
      輸入文件名 ab.in
      輸出文件名 ab.out

      最后應該提交的的源文件,應當命名為:ab.cpp,并存放如下內容

      #include<iostream>
      using namespace std;
      int main() {
          freopen("ab.in", "r", stdin);    //讀入文件
          freopen("ab.out", "w", stdout);  //輸出文件
      
          long long a,b; cin>>a>>b;
          cout<<a+b;
      
          fclose(stdin);  //關閉輸入流
          fclose(stdout); //關閉輸出流
          return 0;
      }
      

      這樣程序就會從文件 ab.in 里面讀取前兩個數據,分別賦值給a,b,從而替代我們手動輸入的過程。
      并且會將a+b的結果保存到文件 ab.out 里面,就不會在控制臺窗口輸出(也就是小黑方框)。

      另外注意一點:題目一般會告訴你,我要提交什么樣的源文件,比如 ab.cpp

      1. P2670 [NOIP2015 普及組] 掃雷游戲

      【題目描述】掃雷游戲是一款十分經典的單機小游戲。
      在 n行 m列的雷區中有一些格子含有地雷(稱之為地雷格),其他格子不含地雷(稱之為非地雷格)。
      玩家翻開一個非地雷格時,該格將會出現一個數字——提示周圍格子中有多少個是地雷格。
      游戲的目標是在不翻出任何地雷格的條件下,找出所有的非地雷格。

      現在給出 n行 m列的雷區中的地雷分布,要求計算出每個非地雷格周圍的地雷格數。
      注:一個格子的周圍格子包括其上、下、左、右、左上、右上、左下、右下八個方向上與之直接相鄰的格子。

      輸入格式:
      第一行是用一個空格隔開的兩個整數 n和 m,分別表示雷區的行數和列數。
      接下來 n行,每行 m個字符,描述了雷區中的地雷分布情況。
      字符 '*' 表示相應格子是地雷格,字符 '?' 表示相應格子是非地雷格。相鄰字符之間無分隔符。

      輸出格式:
      輸出文件包含 n行,每行 m個字符,描述整個雷區。用 '*' 表示地雷格,用周圍的地雷個數表示非地雷格。
      相鄰字符之間無分隔符。

      輸入樣例:

      3 3
      *??
      ???
      ?*?
      

      輸出樣例:

      *10
      221
      1*1
      

      數據范圍:對于 100% 的數據, 1≤n≤100, 1≤m≤100。

      題解:按照九宮格的思想對字符串數組進行遍歷即可,最后九宮格中中間存放的是該九宮格中地雷數

      #include<bits/stdc++.h>
      using namespace std;
      const int N=200;
      char a[N][N];//字符數組存放輸入的字符 
      int b[N][N];//整型數組存放以ij為中心的九宮格的地雷數 
      int main() {
          int n,m;    cin>>n>>m;
          for(int i=1; i<=n; i++) {
              for(int j=1; j<=m; j++) {
                  cin>>a[i][j];
              }
          }
          for(int i=1; i<=n; i++) {
              for(int j=1; j<=m; j++) {
                  if(a[i-1][j-1]=='*') b[i][j]++;//b[i][j]=b[i][j]+1;
                  if(a[i-1][j]=='*')   b[i][j]++;//地雷數量+1
                  if(a[i-1][j+1]=='*') b[i][j]++;
      
                  if(a[i][j-1]=='*') b[i][j]++;
                  if(a[i][j+1]=='*') b[i][j]++;
      
                  if(a[i+1][j-1]=='*') b[i][j]++;
                  if(a[i+1][j]=='*')   b[i][j]++;
                  if(a[i+1][j+1]=='*') b[i][j]++;
              }
          }
          for(int i=1; i<=n; i++) {
              for(int j=1; j<=m; j++) {
                  if(a[i][j]=='*') cout<<a[i][j];//如果是地雷就輸出地雷 
                  else cout<<b[i][j];//不是地雷輸出該九宮格的地雷數 
              } cout<<endl;
          } return 0;
      }
      

      2. P1003 [NOIP2011 提高組] 鋪地毯

      【題目描述】為了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角坐標系的第一象限)鋪上一些矩形地毯。
      一共有 n 張地毯,編號從 1 到 n。
      現在將這些地毯按照編號從小到大的順序平行于坐標軸先后鋪設,后鋪的地毯覆蓋在前面已經鋪好的地毯之上。

      地毯鋪設完成后,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。
      注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。

      輸入格式:輸入共 n+2 行。第一行,一個整數 n,表示總共有 n 張地毯。
      接下來的 n 行中,第 i+1 行表示編號 i 的地毯的信息,包含四個整數 a ,b ,g ,k,
      每兩個整數之間用一個空格隔開,分別表示鋪設地毯的左下角的坐標 (a,b) 以及地毯在 x 軸和 y 軸方向的長度。
      第 n+2 行包含兩個整數 x 和 y,表示所求的地面的點的坐標 (x, y)。

      輸出格式:
      輸出共 1 行,一個整數,表示所求的地毯的編號;若此處沒有被地毯覆蓋則輸出 -1。

      輸入樣例

      3
      1 0 2 3
      0 2 3 3
      2 1 3 3
      2 2
      

      輸出樣例:3

      數據范圍:
      對于 30% 的數據,有 n≤2。
      對于 50% 的數據,有 0≤a,b,g,k≤100。
      對于 100% 的數據,有 0≤n≤10。

      題解:題目要最上面的地毯編號,那么可以直接從后向前判斷,如果發現地毯就輸出,并結束。

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4+1;
      int a[N],b[N],g[N],k[N];
      int main(){
          int n; cin>>n;
          for(int i=1; i<=n; i++){
              cin>>a[i]>>b[i]>>g[i]>>k[i];
          }
          int x,y; cin>>x>>y;
          for(int i=n; i>=1; i--){//注意逆序查找,保證查找的是最上面的地毯
              if(x>=a[i] && x<=a[i]+g[i] && y>=b[i] && y<=b[i]+k[i]){
                  cout<<i; return 0;//找到結果就退出 
              }
          }
          cout<<-1; return 0;
      } 
      

      3. P1067 [NOIP2009 普及組] 多項式輸出

      一元n次多項式可用如下的表達式表示:

      \[f(x) = a_nx^n + a_{n-1} x^{n-1} +...+a_1x+a_0, a_n!=0 \]

      給出一個一元多項式各項的次數和系數,請按照如下規定的格式要求輸出該多項式:

      1. 多項式中自變量為x,從左到右按照次數遞減順序給出多項式。
      2. 多項式中只包含系數不為0的項。
      3. 如果多項式n次項系數為正,則多項式開頭不出現“+”號,如果多項式n次項系數為負,則多項式以“-”號開頭。
      4. 對于不是最高次的項,以“+”號或者“-”號連接此項與前一項,分別表示此項系數為正或者系數為負。
        緊跟一個正整數,表示此項系數的絕對值(如果一個高于0次的項,其系數的絕對值為1,則無需輸出 1)。
        如果x的指數大于1,則接下來緊跟的指數部分的形式為“x^b”,其中 b 為 x 的指數;
        如果 x 的指數為 1,則接下來緊跟的指數部分形式為“x”;
        如果 x 的指數為0,則僅需輸出系數即可。
      5. 多項式中,多項式的開頭、結尾不含多余的空格。

      輸入格式:
      輸入共有 2 行,第一行1 個整數n,表示一元多項式的次數。
      第二行有 n+1個整數,其中第 i 個整數表示第 n-i+1 次項的系數,每兩個整數之間用空格隔開。

      輸出格式:
      輸出共 1 行,按題目所述格式輸出多項式。

      輸入樣例

      5 
      100 -1 1 -3 0 10
      

      輸出樣例:

      100x^5-x^4+x^3-3x^2+10
      

      數據范圍:對于100%數據,0≤n≤100,?100≤系數 ≤100。

      #include<bits/stdc++.h>
      using namespace std;
      int a[101];
      int main(){
          int n;cin>>n;
          for(int i=n; i>=0; i--)    cin>>a[i];
          for(int i=n; i>=0; i--){
              if(i==n){
                  if(a[i]>0){
                      if(a[i]==1)    cout<<"x^"<<i; 
                      else cout<<a[i]<<"x^"<<i;
                  }else if(a[i]<0){
                      if(a[i]==-1) cout<<"-x^"<<i;
                      else cout<<a[i]<<"x^"<<i; 
                  }
              }else if(i==0){
                  if(a[i]>0){
                      cout<<"+"<<a[i];
                  }else if(a[i]<0){
                      cout<<a[i];
                  }
              }else if(i==1){
                  if(a[i]>0){
                      if(a[i]==1)    cout<<"+x"; 
                      else cout<<"+"<<a[i]<<"x";
                  }else if(a[i]<0){
                      if(a[i]==-1) cout<<"-x";
                      else cout<<a[i]<<"x"; 
                  }
              }else{
                  if(a[i]>0){
                      if(a[i]==1)    cout<<"+"<<"x^"<<i; 
                      else cout<<"+"<<a[i]<<"x^"<<i;
                  }else if(a[i]<0){
                      if(a[i]==-1)    cout<<"-x^"<<i; 
                      else cout<<a[i]<<"x^"<<i;
                  }
              } 
          }return 0;
      }
      //當然還有更簡短的方法
      #include<stdio.h>
      #include<math.h>
      int main(){
          int n,arr[105];
          scanf("%d",&n);
          for(int i=0;i<=n;i++) scanf("%d",&arr[i]);
          for(int i=0,k=n;i<=n;i++,k--){
              if(arr[i]==0) continue;
              if(k!=n&&arr[i]>0) printf("+");
              if(abs(arr[i])>1||k==0) printf("%d",arr[i]);
              if(arr[i]==-1&&k) printf("-");
              if(k>1) printf("x^%d",k);
              if(k==1) printf("x");
          }
          return 0;
      }
      

      4. P2615 [NOIP2015 提高組] 神奇的幻方

      【題目描述】

      幻方是一種很神奇的 NxN矩陣:它由數字1,2,3,?,NxN構成,且每行、每列及兩條對角線上的數字之和都相同。
      當 N 為奇數時,我們可以通過下方法構建一個幻方:
      首先將 1 寫在第一行的中間。
      之后,按如下方式從小到大依次填寫每個數K=2,3,?,NxN) :

      1. 若 (K-1) 在第一行但不在最后一列,則將 K填在最后一行, (K-1)所在列的右一列;
      2. 若 (K?1) 在最后一列但不在第一行,則將 K填在第一列, (K-1)所在行的上一行;
      3. 若 (K?1) 在第一行最后一列,則將 KK 填在 (K-1)的正下方;
      4. 若 (K?1) 既不在第一行,也不在最后一列,如果 (K-1)的右上方還未填數,則將 K填 (K?1) 的右上方,否則將K填在 (K-1)的正下方。

      現給定 N,請按上述方法構造NxN 的幻方。

      輸入格式:一個正整數 N,即幻方的大小。
      輸出格式:共 N 行 ,每行N個整數,即按上述方法構造出的 NxN的幻方,相鄰兩個整數之間用單空格隔開。

      輸入樣例:3
      輸出樣例:

      8 1 6
      3 5 7
      4 9 2
      

      數據范圍:對于100%的數據,對于全部數據,1≤N≤39 且 N 為奇數。

      題解:本題屬于模擬題,按照題目要求來模擬即可,但是要注意界限問題

      #include<iostream>
      using namespace std;
      const int N=40;
      int a[N][N];
      int main() {
          int n; cin>>n;
          int mid = n/2+1, cnt=1;
          a[1][mid] = cnt = 1;
      
          int h=1, l=mid;
          while(cnt<=n*n) {
              if(h==1 && l!=n) {
                  h = n;
                  l = l+1;
                  a[h][l] = ++cnt;
              }
      
              if(l==n && h!=1) {
                  h = h-1;
                  l = 1;
                  a[h][l] = ++cnt;
              }
      
              if(h==1 && l==n) {
                  h = h+1;
                  a[h][l] = ++cnt;
              }
      
              if(h!=1 && l!=n) {
                  if(a[h-1][l+1]==0) {
                      h = h-1;
                      l = l+1;
                      a[h][l] = ++cnt;
                  } else {
                      h = h+1;
                      l = l;
                      a[h][l] = ++cnt;
                  }
              }
          }
      
          for(int i=1; i<=n; i++) {
              for(int j=1; j<=n; j++) {
                  cout<<a[i][j]<<" ";
              }cout<<endl;
          } return 0;
      }
      

      5. P2141 [NOIP2014 普及組] 珠心算測驗

      【題目描述】珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。
      珠心算訓練,既能夠開發智力,又能夠為日常生活帶來很多便利,因而在很多學校得到普及。

      某學校的珠心算老師采用一種快速考察珠心算加法能力的測驗方法。
      他隨機生成一個正整數集合,集合中的數各不相同,然后要求學生回答:其中有多少個數,恰好等于集合中另外兩個(不同的)數之和?

      最近老師出了一些測驗題,請你幫忙求出答案。

      輸入格式:
      共兩行,第一行包含一個整數n,表示測試題中給出的正整數個數。
      第二行有n個正整數,每兩個正整數之間用一個空格隔開,表示測試題中給出的正整數。

      輸出格式:一個整數,表示測驗題答案。

      輸入樣例:

      4
      1 2 3 4
      

      輸出樣例:2

      樣例說明:由1+2=3,1+3=4,故滿足測試要求的答案為2。
      注意,加數和被加數必須是集合中的兩個不同的數。

      數據范圍:對于100%的數據,3≤n≤100,測驗題給出的正整數大小不超過10,000。

      題解:最暴力的方法,直接枚舉

      #include<bits/stdc++.h>
      using namespace std;
      const int N = 10005; 
      int a[N],b;
      int main(){
          int n;cin>>n;
          for(int i=0; i<n; i++) cin>>a[i];
          int ans=0;  sort(a,a+n);//排序一下 
          for(int i=2; i<n; i++){
              for(int j=0; j<i; j++){
                  bool flag = 0; 
                  for(int k=1; k<i; k++){
                      if(a[i]==a[j]+a[k] && j!=k){//加數和被加數不同 
                          flag = 1;break;
                      }
                  }
                  if(flag) ans++;
              }
          }
          cout<<ans; return 0;
      }
      

      6. P1055 [NOIP2008 普及組] ISBN 號碼

      【題目描述】每一本正式出版的圖書都有一個ISBN號碼與之對應,
      ISBN碼包括 9 位數字、1 位識別碼和 3 位分隔符,其規定格式如 x-xxx-xxxxx-x,
      其中符號-就是分隔符(鍵盤上的減號),最后一位是識別碼,例如 0-670-82162-4 就是一個標準的ISBN碼。
      ISBN碼的首位數字表示書籍的出版語言,例如0代表英語;
      第一個分隔符-之后的三位數字代表出版社,例如670代表維京出版社;
      第二個分隔符后的五位數字代表該書在該出版社的編號;最后一位為識別碼。識別碼的計算方法如下:

      首位數字乘以 1 加上次位數字乘以 2…… 以此類推,用所得的結果 mod 11,所得的余數即為識別碼,
      如果余數為 10,則識別碼為大寫字母X。
      例如ISBN號碼 0-670-82162-4 中的識別碼 4 是這樣得到的:對 067082162 這 9 個數字,
      從左至右,分別乘以 1,2,...,9 再求和,即 0×1+6×2+……+2×9=158,然后取 11158 mod 11 的結果 4 作為識別碼。

      你的任務是編寫程序判斷輸入的ISBN號碼中識別碼是否正確,
      如果正確,則僅輸出Right;
      如果錯誤,則輸出你認為是正確的ISBN號碼。

      輸入格式:一個字符序列,表示一本書的ISBN號碼(保證輸入符合ISBN號碼的格式要求)。

      輸出格式:一行,假如輸入的ISBN號碼的識別碼正確,那么輸出Right,否則,按照規定的格式,輸出正確的ISBN號碼(包括分隔符-)。

      輸入樣例:0-670-82162-4
      輸出樣例:Right
      輸入樣例:0-670-82162-0
      輸出樣例:0-670-82162-4

      題解:

      #include<iostream>
      using namespace std;
      char a[14];
      int main() {
          for(int i=1; i<=13; i++) cin>>a[i];
          int x = ((a[1]-'0')*1 +
                  (a[3]-'0')*2+(a[4]-'0')*3+(a[5]-'0')*4+(a[7]-'0')*5+(a[8]-'0')*6+
                  (a[9]-'0')*7+(a[10]-'0')*8+(a[11]-'0')*9) % 11;
          bool flag = ((a[13]-'0') == x || (x==10 && a[13]=='X'));
          if(flag) {
              cout<<"Right"<<endl;
          } else {
              for(int i=1; i<=12; i++) cout<<a[i];
              if(x==10) cout<<"X";
              else cout<<x;
          }return 0;
      }
      

      7. P1042 [NOIP2003 普及組] 乒乓球

      【題目背景】國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革,以推動乒乓球運動在全球的普及。
      其中 11 分制改革引起了很大的爭議,有一部分球員因為無法適應新規則只能選擇退役。
      華華就是其中一位,他退役之后走上了乒乓球研究工作,意圖弄明白 11 分制和 21 分制對選手的不同影響。
      在開展他的研究之前,他首先需要對他多年比賽的統計數據進行一些分析,所以需要你的幫忙。

      【題目描述】華華通過以下方式進行分析,首先將比賽每個球的勝負列成一張表,然后分別計算在 11 分制和 21 分制下,雙方的比賽結果(截至記錄末尾)。

      比如現在有這么一份記錄,(其中 W 表示華華獲得一分,L 表示華華對手獲得一分):WWWWWWWWWWWWWWWWWWWWWWLW

      在 11分制下,此時比賽的結果是華華第一局 11 比 0 獲勝,第二局 11 比 0 獲勝,正在進行第三局,當前比分 1 比 1。
      而在 21 分制下,此時比賽結果是華華第一局 21 比 0 獲勝,正在進行第二局,比分 2 比 1。
      如果一局比賽剛開始,則此時比分為 0 比 0。直到分差大于或者等于 2,才一局結束。

      你的程序就是要對于一系列比賽信息的輸入(WL 形式),輸出正確的結果。

      輸入格式:
      每個輸入文件包含若干行字符串,字符串有大寫的 W,L 和 E 組成。
      其中E 表示比賽信息結束,程序應該忽略 E之后的所有內容。
      每行至多 25 個字母,最多有2500 行。

      輸出格式:
      輸出由兩部分組成,每部分有若干行,每一行對應一局比賽的比分(按比賽信息輸入順序)。
      其中第一部分是 11 分制下的結果,第二部分是 21 分制下的結果,兩部分之間由一個空行分隔。

      輸入樣例:

      WWWWWWWWWWWWWWWWWWWW
      WWLWE
      

      輸出樣例:

      11:0
      11:0
      1:1
      
      21:0
      2:1
      

      題解:這是關于字符串的一個模擬題,對于字符串的題目,需要的是冷靜思考,不斷Debug

      #include<iostream>
      #include<cmath>
      using namespace std;
      int t11[6000][3];
      int t21[3000][3];
      int main() {
          char s;
          int i=1,j=1;//局數
          do {
              cin>>s;
              if(s=='W') {
                  t11[i][1]++;
                  t21[j][1]++;
              }
              if(s=='L') {
                  t11[i][2]++;
                  t21[j][2]++;
              }
              if((abs(t11[i][1]-t11[i][2])>=2) && ((t11[i][1]>=11)||(+t11[i][2]>=11))) i++;
              if((abs(t21[j][1]-t21[j][2])>=2) && ((t21[j][1]>=21)||(+t21[j][2]>=21))) j++;
          } while(s!='E');
          
          for(int k=1; k<=i; k++){
              cout<<t11[k][1]<<":"<<t11[k][2]<<endl;
          }
          cout<<endl;
          for(int k=1; k<=j; k++){
              cout<<t21[k][1]<<":"<<t21[k][2]<<endl;
          }return 0;
      }
      

      補充. U169789 蛇形輸出 - 二維數組

      【題目描述】輸入兩個數,代表n行m列,然后從1開始蛇形輸出1~n*m的方陣,且方陣中每個數字占5個寬度

      輸入格式:輸入兩個數,代表n行m列

      輸出格式:輸出一個方陣,且方陣中每個數字占5個寬度

      輸入樣例:3 4

      輸出樣例:

          1    2    3    4
          8    7    6    5
          9   10   11   12
      

      題解:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4;
      int a[N][N];
      
      //程序先讀入兩個數,代表n行m列,然后從1開始蛇形輸出1~n*m
      int main(){
          int n=3,m=4; cin>>n>>m;//行,列 
          int k=0, i=0, j=0;
          while(k<n*m) {
              while(k<n*m && j<m){//向右 
                  a[i][j++] = ++k;
              }
              i++;
              while(k<n*m && j>0){//向左 
                  a[i][--j] = ++k;
              }
              i++;
          }
          for(int i=0; i<n; i++){
              for(int j=0; j<m; j++){
                  printf("%5d",a[i][j]);//cout<<setw(5)<<a[i][j];//保留5位寬度
              }cout<<endl;
          }
          return 0;
      }
      

      補充. U169790 圖像旋轉 - 二維數組

      【題目描述】輸入一個n行m列的黑白圖像,將它順時針旋轉90°后輸出。

      輸入格式:

      第一行包含兩個整數n和m,表示圖像包含像素點的行數和列數。

      1<=n<=100,1<=m<=100;

      接下來n行,每行m個整數,表示每個圖像的每個像素點灰度。

      相鄰兩個整數之間用單個空格隔開,每個元素均在0~255之間。

      輸出格式:

      輸出m行,每行n個整數,為順時針旋轉90°后的圖像。

      圖像中每個數字占5個寬度

      輸入樣例:

      3 3
      1 2 3
      4 5 6
      7 8 9
      

      輸出樣例:

      7 4 1
      8 5 2
      9 6 3
      

      題解:本類題目主要是根據下標找到規律,要養成習慣,根據下標找到規律

      3 3
      1 2 3
      4 5 6
      7 8 9
      
      7 4 1
      8 5 2
      9 6 3
      //根據下標找到規律
      11 12 13 14 
      21 22 23 24
      31 32 33 34
      41 42 43 44
      
      41 31 21 11
      42 32 22 12
      43 33 23 13
      44 34 24 14
      
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4;
      int a[N][N];
      int main() {
          int n,m; cin>>n>>m;
          for(int i=0; i<n; i++) {
              for(int j=0; j<m; j++) {
                  cin>>a[i][j];
              }
          }
          for(int i=0; i<m; i++) {
              for(int j=n-1; j>=0; j--) {
                  cout<<setw(5)<<a[j][i];
              }cout<<endl;
          }return 0;
      }
      
      posted @ 2021-08-04 15:52  HelloHeBin  閱讀(257)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 无码激情亚洲一区| 黑人欧美一级在线视频| 亚洲中文字幕久久精品蜜桃| 国产精品视频一区二区噜| 成人午夜在线观看刺激| 欧美亚洲h在线一区二区| 久久人人97超碰人人澡爱香蕉 | 亚洲欧美日韩综合久久| 国产最新进精品视频| 一本色道久久东京热| 好硬好湿好爽好深视频| 鲁丝片一区二区三区免费| 97人人添人澡人人爽超碰| 亚洲人妻精品一区二区| 蜜桃视频网站| 亚洲天堂精品一区二区| 国产精品福利自产拍久久| 山丹县| 激情内射亚洲一区二区三区| 深夜精品免费在线观看| 中国china体内裑精亚洲日本| 精品国产av一二三四区| 人妻少妇精品中文字幕| 邵阳县| 亚洲欧美人成人让影院| 成人午夜在线观看日韩| 人妻系列无码专区免费| 日韩一区二区三区在线观院| 在线日韩一区二区| 国产一区二区三区不卡视频 | VA在线看国产免费| 性久久久久久| brazzers欧美巨大| 97免费在线观看视频| 三级黄色片一区二区三区| 亚洲VA成无码人在线观看天堂| 国产一区二区高清不卡| 韩国精品一区二区三区| 国产自产对白一区| 久久亚洲精品情侣| 不卡一区二区国产精品|