程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> nyoj 稍具技巧的題

nyoj 稍具技巧的題

編輯:C++入門知識

這題可以用中國剩余定理(這個我不會),我用的只是從1到105逐個搜索

[cpp]
#include<iostream> 
using namespace std; 
int main() 

    int a,b,c; 
    cin>>a>>b>>c; 
    int n=(a*70+b*21+c*15)%105; 
    if(n>100||n<10) cout<<"No answer"<<endl; 
    else cout<<n<<endl; 
    return 0; 

小明的調查作業 nyoj 48
此題根據規模進行,可以開一個a【1005】的數組,每讀一個i,
就把a【i】賦值為true,然後遍歷輸出,重復計算問題,也挺省時間的。

[cpp]
#include<iostream> 
#include<cstring> 
using namespace std; 
int main() 

    int n, num; 
    int count=0; 
    int vis[1005]; 
    cin>>n; 
    memset(vis, 0, sizeof(vis)); 
    while(n--) 
    { 
              cin>>num; 
              if(!vis[num]) 
              { 
                        vis[num]=1; 
                        count++; 
              } 
    } 
    cout<<count<<endl; 
    for(int i=1;i<=1000;i++) 
            if(vis[i]) 
                        cout<<i<<" "; 
     
    cout<<endl; 
    return 0; 

數的長度 nyoj 69

此題有一種很准確的方法叫斯特林(Stirling)公式;

還有一種也能行,不過數太大時就不是非常准確的方法:

for(int i=1;i<=m;i++)
                      num += log10(i);

就是對每個乘數取對數

[cpp] 
#include<iostream> 
#include<cmath> 
using namespace std; 
int main() 

    int N; 
    cin>>N; 
    while(N--) 
    { 
              int m; 
              double num = 0.0; 
              cin>>m; 
              for(int i=1;i<=m;i++) 
                      num += log10(i); 
              cout<<(int)(num)+1<<endl; 
    } 
    return 0; 

房間安排 nyoj 168
用數組a【201】存放第i天中每天需要的房間數,讀房間數、天數,然後找出數組中

最大的元素#include<algorithm>
int p = max_element(a, a+200)-a;
              cout<<a[p]<<endl;
[cpp] 
#include<iostream> 
#include<cstring> 
#include<algorithm> 
using namespace std; 
int a[201];    //第i天的房間數  
int main() 

    int T; 
    cin>>T; 
    while(T--) 
    { 
              memset(a, 0, sizeof(a)); 
              int N, num, start, day; 
              cin>>N; 
              while(N--) 
              { 
                    cin>>num>>start>>day; 
                    for(int i=0;i<day;i++) 
                            a[start+i] += num;     
              } 
              int p = max_element(a, a+200)-a; 
              cout<<a[p]<<endl; 
    } 
    return 0; 

素數 nyoj 169
主函數部分設計的很巧妙,先近後遠,距離相等的話先大後小

[cpp] 
#include<iostream> 
using namespace std; 
bool fan(int a) 

    bool b=true; 
    int i; 
    if(a==1) 
        b=false; 
    else 
        for(i=2;i<a;i++) 
        { 
            if(a%i==0) 
            {b=false;break;} 
        } 
    return b; 

int main() 

    int n; 
    cin>>n; 
    while(n--) 
    { 
        int m,i; 
        cin>>m; 
        for(i=0;;i++) 
        { 
            if(fan(m+i)) 
            {cout<<m+i<<endl;break;} 
            if(fan(m-i)) 
            {cout<<m-i<<endl;break;} 
        } 
    } 
    return 0; 
}       
字母統計 nyoj 241
此題類似重復計數,用一個數組保存,然後用‘a’+index;算是比較巧妙吧

[cpp] 
#include<iostream> 
#include<cstring> 
#include<string> 
using namespace std; 
int num[26]; 
int main() 

    int N; 
    string str; 
    cin>>N; 
    while(N--) 
    { 
              memset(num, 0, sizeof(num)); 
              cin>>str; 
                      char ch; 
                      for(int j=0;j<str.size();j++) 
                      { 
                              ch = str.at(j); 
                              num[(int)(ch-'a')]++; 
                      } 
                      int max = num[0]; 
                      int index = 0; 
                      for(int i=0;i<26;i++) 
                      { 
                              if(num[i] > max) 
                              { 
                                        max = num[i]; 
                                        index = i; 
                              } 
                      } 
                      ch = 'a' + index; 
                      cout<<ch<<endl; 
    } 
    return 0; 

16進制的簡單運算 nyoj 244
傷心的代碼,我用c++寫了好長,人家兩句讀入輸出,換一下格式ok

 scanf("%x%c%x", &a, &c, &b);
              if(c == '+')
                   printf("%o\n", a+b);
              if(c == '-')
                   printf("%o\n", a-b);

[cpp] 
#include<iostream> 
#include<string> 
using namespace std; 
int main() 

    int N; 
    string str; 
    cin>>N; 
    while(N--) 
    { 
              cin>>str; 
              char ch; 
              int num1 = 0; 
              int num2 = 0; 
              int temp; 
              int oper = str.find('+'); 
              if(oper == -1) 
                      oper = str.find('-'); 
              for(int i=0;i<oper;i++) 
              { 
                      ch = str.at(i); 
                      num1 *= 16; 
                      if(ch >= '0' && ch <= '9') 
                            temp = ch - '0'; 
                      else if(ch >= 'a' && ch <= 'f') 
                            temp = ch - 'a' + 10; 
                      num1 += temp; 
              } 
               
              cout<<num1<<endl; 
               
              for(int i=oper+1;i<str.size();i++) 
              { 
                      ch = str.at(i); 
                      num2 *= 16; 
                      if(ch >= '0' && ch <= '9') 
                            temp = ch - '0'; 
                      else if(ch >= 'a' && ch <= 'f') 
                            temp = ch - 'a' + 10; 
                      num2 += temp; 
              } 
               
              cout<<num2<<endl; 
               
              ch = str.at(oper); 
              if(ch == '+') 
              { 
                    num1 += num2;  
              } 
              else if(ch == '-') 
              { 
                   num1 -= num2; 
              } 
              cout<<num1<<endl; 
              str = ""; 
              while(num1) 
              { 
                         str += ('0'+(num1 % 8)); 
                         num1 /= 8; 
              } 
              string s(str.rbegin(),str.rend()); 
              cout << s <<endl; 
    } 
    return 0; 

[cpp] 
#include<iostream> 
#include<cstdio> 
using namespace std; 
int main() 

    int N; 
    cin>>N; 
    while(N--) 
    { 
              int a, b; 
              char c; 
              scanf("%x%c%x", &a, &c, &b); 
              if(c == '+') 
                   printf("%o\n", a+b); 
              if(c == '-') 
                   printf("%o\n", a-b); 
    } 
    return 0; 

荷蘭國旗問題 nyoj 268
用三個數分別記下三個字母出現的次數,然後依序輸出就行了,他們提供的最優代碼也是這樣寫的

[cpp] 
#include<iostream> 
#include<string> 
using namespace std; 
int main() 

    int T; 
    cin>>T; 
    while(T--) 
    { 
              string s1; 
              int a=0,b=0,c=0; 
              cin>>s1; 
              for(int i=0;i<s1.size();i++) 
              { 
                      if(s1.at(i) == 'R') 
                      { 
                                  a++; 
                      } 
                      else if(s1.at(i) == 'W') 
                           b++; 
                      else 
                          c++; 
              } 
              for(int i=0;i<a;i++) 
                      cout<<"R"; 
              for(int i=0;i<b;i++) 
                      cout<<"W"; 
              for(int i=0;i<c;i++) 
                      cout<<"B"; 
              cout<<endl; 
               
    } 
    return 0; 

正三角形的外接圓面積 nyoj 274
看一個叫做“寶”的仁兄的代碼,我覺得很好,收集一下:

[cpp] 
#include <iostream> 
using namespace std; 
#define PI 3.1415926 
int main() 

    int m; 
    cin>>m; 
    while(m--) 
    { 
        double s,a; 
        cin>>a; 
        s=PI*a*a/3.0; 
        cout.setf(ios_base::fixed); 
        cout.precision(2); 
        cout<<s<<endl; 
    } 
    return 0; 
}  
算菜價 nyoj 316
還是“寶”兄的代碼,不過這次他用了C

[cpp] 
#include<stdio.h> 
int main() 

    double a,b,sum=0; 
    char c[20]; 
    while(scanf("%s%lf%lf",c,&a,&b)!=EOF) 
    { 
        sum=sum+a*b; 
    } 
    printf("%.1lf\n",sum); 
    return 0; 
}    
小光棍數 nyoj 458
第一個光棍數是471,第二個是1000+471,第三個是2000+471,總之是1000的整倍數加471(我不會證明。。。。)

[cpp] 
#include<iostream> 
using namespace std; 
int main() 

    int n; 
    cin>>n; 
    while(n--) 
    { 
          long long int m; 
          cin>>m; 
          cout<<(m-1)*1000+471<<endl;     
    } 
     
    return 0; 
} www.2cto.com
[cpp] 
#include<iostream> 
#include<cstdio> 
using namespace std; 
int main() 

    long long int n, m; 
    scanf("%lld", &n); 
    while(n--) 
    { 
              scanf("%lld", &m); 
              printf("%lld\n", (m-1)*1000+471); 
    } 
    return 0; 

0


作者:Slience_Perseverance

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved