天天看點

codeup 5.1 數學問題->簡單數學

問題 A: 守形數

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 340  解決: 167

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

守形數是這樣一種整數,它的平方的低位部分等于它本身。

比如25的平方是625,低位部分是25,是以25是一個守形數。

編一個程式,判斷N是否為守形數。

輸入

輸入包括1個整數N,2<=N<100。

輸出

可能有多組測試資料,對于每組資料,

輸出"Yes!”表示N是守形數。

輸出"No!”表示N不是守形數。

樣例輸入

6
11      

樣例輸出

Yes!
No!      

代碼:

#include<iostream>     
using namespace std;

const int N=1e4+1;

//n轉換為數組存到A[]裡 傳回數組長度
int int2array(int n,int A[]){
  int index=0;
  while(n){
    A[index++]=n%10;
    n/=10;
  }
  return index;
}

int main(){
  int n,m;
  int l1,l2;
  int a1[N],a2[N];
  bool flag;
  while(cin>>n){
    flag=true;
    l1=int2array(n,a1);
    l2=int2array(n*n,a2);
    for(int i=0;i<l1;i++){
      if(a1[i]!=a2[i]) flag=false;
    }
    if(flag){
      cout<<"Yes!"<<endl;
    }else{
      cout<<"No!"<<endl;
    }
  }
  return 0;
}      

問題 B: 反序數

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 172  解決: 143

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

設N是一個四位數,它的9倍恰好是其反序數(例如:1234的反序數是4321)

求N的值

輸入

程式無任何輸入資料。

輸出

輸出題目要求的四位數,如果結果有多組,則每組結果之間以回車隔開。

答案:1089

#include<iostream>     
using namespace std;

const int N=1e5;

//n轉換為數組存到A[]裡 傳回數組長度
int int2array(int n,int A[]){
  int index=0;
  while(n){
    A[index++]=n%10;
    n/=10;
  }
  return index;
}

int main(){
  int l1,l2;
  int a1[N],a2[N];
  for(int i=1000;i<=9999;i++){
    bool flag=true;
    l1=int2array(i,a1);
    l2=int2array(i*9,a2);
    if(l1==l2){
      for(int i=0;i<l1;i++){
        if(a1[i]!=a2[l2-i-1]) {
          flag=false;
          break;
        }
      }
      if(flag){
        cout<<i<<endl;
      }
    }
  }
  
  return 0;
}      

數學問題勤動筆

分數化整數,以免不必要的麻煩  先化簡方程,多麼簡單的思想

x+y+z=100

5x+3y+1/3*z<=n

即是:

x+y+z=100

15x+9y+z<=n

#include<iostream>     
using namespace std;

int main(){
  int x,y,z;
  int n;
  while(cin>>n){
    n*=3;
    for(x=0;x<=n/15&&x<=100;x++){//x<=n/5不是100/5  睡久了發昏了
      for(y=0;y<=(n-15*x)/9&&y<=(100-x);y++){//x<=n/3不是100/3  睡久了發昏了
        z=(100-x-y);
        if(15*x+9*y+z<=n){
          cout<<"x="<<x<<",y="<<y<<",z="<<z<<endl;
        }
      }
    }
  }
  return 0;
}      

問題 D: abc

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 141  解決: 131

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

設a、b、c均是0到9之間的數字,abc、bcc是兩個三位數,且有:abc+bcc=532。求滿足條件的所有a、b、c的值。

輸入

題目沒有任何輸入。

輸出

請輸出所有滿足題目條件的a、b、c的值。

a、b、c之間用空格隔開。

每個輸出占一行。

#include<iostream>     
using namespace std;
int main(){
  int a,b,c;
  for(a=0;a<=9;a++){
    for(b=0;b<=9;b++){
      for(c=0;c<=9;c++){
        int x=100*a+10*b+c;
        int y=100*b+10*c+c;
        if(x+y==532){
          cout<<a<<" "<<b<<" "<<c<<endl;
        }
      }
    }
  }
  return 0;
}      

問題 E: 衆數

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 327  解決: 120

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

輸入20個數,每個數都在1-10之間,求1-10中的衆數(衆數就是出現次數最多的數,如果存在一樣多次數的衆數,則輸出權值較小的那一個)。

輸入

測試資料有多組,每組輸入20個1-10之間的數。

輸出

對于每組輸入,請輸出1-10中的衆數。

注意如果存在一樣多次數的衆數,則輸出權值較小的那一個。

樣例輸入

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

樣例輸出

6      
#include<iostream>    
#include<cstring> 
#include<algorithm>
using namespace std;

struct KK
{
  int value;
  int count;
}kk[21];

bool cmp(KK k1,KK k2){
  if(k1.count==k2.count)  return k1.value<k2.value;
  return k1.count>k2.count;
}

void clearKK(){
  for(int i=1;i<=10;i++){
    kk[i].value=i;
    kk[i].count=0;
  }
}

int main(){
  int x,N=20;
  while(cin>>x){
    clearKK();
    kk[x].count++;
    for(int i=1;i<N;i++){
      cin>>x;
      kk[x].count++;
    }
    sort(kk+1,kk+11,cmp);
    cout<<kk[1].value<<endl;//注意是kk[1]不是kk[0]  1~10排序的

  }
  return 0;
}      

問題 F: 計算兩個矩陣的乘積

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 200  解決: 112

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

計算兩個矩陣的乘積,第一個是2*3矩陣,第二個是3*2矩陣,結果為一個2*2矩陣。

輸入

輸入包含多組資料,先輸入一個2*3矩陣,再輸入一個3*2矩陣。

輸出

輸出兩個矩陣的乘積。

樣例輸入

1 1 1
1 1 1
1 1
1 1
1 1      

樣例輸出

3 3
3 3      

好多年沒看數學了,矩陣運算都快忘了,唉!

#include<iostream>     
using namespace std;

int main(){
  int a[2][3],b[3][2],c[2][2];
  while(cin>>a[0][0]){
    //輸入a[]
    for(int i=0;i<2;i++){
      for(int j=0;j<3;j++){
        if(i==0&&j==0) continue;
        cin>>a[i][j];
      }
    }

    //輸入b[]
    for(int i=0;i<3;i++){
      for(int j=0;j<2;j++){
        cin>>b[i][j];
      }
    }

    //計算a[]*b[]
    for(int i=0;i<2;i++){//A[i][j]   A的行
      for(int k=0;k<2;k++){//B[j][k]  B的列
        int ans=0;
        for(int j=0;j<3;j++){ //A的列  (A列==B行)
          ans+=a[i][j]*b[j][k];
        }  
        c[i][k]=ans;
      }  
    }

    //輸入結果c[]
    for(int i=0;i<2;i++){
      for(int j=0;j<2;j++){
        cout<<c[i][j]<<" ";
      }
      cout<<endl;
    }

  }
  return 0;
}      

問題 H: 整數和

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 138  解決: 103

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

編寫程式,讀入一個整數N。若N為非負數,則計算N 到2N 之間的整數和;若N為一個負數,則求2N 到N 之間的整數和。

輸入

第一行表示樣例數m,接下來m行每行一個整數N,N的絕對值不超過100。

輸出

輸出m行,每行表示對應的題目所求。

樣例輸入

2
2
-1      

樣例輸出

9
-3      

提示

 注意N可能為負數

#include<iostream>     
using namespace std;
int main(){
  int m,n,sum;
  cin>>m;
  while(m--){
    cin>>n;
    sum=0;
    if(n<0){
      for(int i=2*n;i<=n;i++){
        sum+=i;
      }
    }else{
      for(int i=n;i<=2*n;i++){
        sum+=i;
      }
    }
    cout<<sum<<endl;
  }

  return 0;
}      

問題 J: 多項式的值

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 149  解決: 95

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

實作一個多項式的類(a+b*x+c*x^2+d*x^3+...+),要求輸入該多項式的系數和x

的值後列印出這個多項式的值。

輸入

輸入第一行為樣例數m,對于每個樣例,第一行為多項式最高項次數n,接下來n+1個整數表示每項系數,最後一個整數x,n不超過10。

輸出

輸出m行,表示個多項式代入x後的值。

樣例輸入

1
2
1 2 3
2      

樣例輸出

17      
#include<iostream>  
#include<cmath>  
using namespace std;
int main(){
  double x,a[101],fx;
  int n,m;
  cin>>m;
  while(m--){
    cin>>n;
    fx=0;
    for(int i=0;i<=n;i++){
      cin>>a[i];
    }
    cin>>x;
    for(int i=0;i<=n;i++){
      fx+=a[i]*pow(x,i);
    }
    cout<<fx<<endl;
  }
  return 0;
}      

問題 K: 疊代求立方根

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 126  解決: 98

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

立方根的逼近疊代方程是 y(n+1) = y(n)*2/3 + x/(3*y(n)*y(n)),其中y0=x.求給定的x經過n次疊代後立方根的值。

輸入

輸入有多組資料。

每組一行,輸入x n。

輸出

疊代n次後的立方根,double精度,保留小數點後面六位。

樣例輸入

4654684 1
65461 23      

樣例輸出

3103122.666667
40.302088      
#include<iostream>     
#include<cstdio>
using namespace std;
int main(){
  int n;
  double x,y;
  while(cin>>x>>n){
    y=x;
    while(n--){
      y=y*2/3+x/(3*y*y);
    }
    printf("%.6f\n",y);
  }
  return 0;
}      

問題 L: 與7無關的數

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 116  解決: 100

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

一個正整數,如果它能被7整除,或者它的十進制表示法中某個位數上的數字為7,

則稱其為與7相關的數.現求所有小于等于n(n<100)的與7無關的正整數的平方和。

輸入

案例可能有多組。對于每個測試案例輸入為一行,正整數n,(n<100)

輸出

對于每個測試案例輸出一行,輸出小于等于n的與7無關的正整數的平方和。

樣例輸入

6
12
18      

樣例輸出

91
601
1575      
#include<iostream>     
using namespace std;

bool notRefre(int n){
  if(n%7==0) return false;
  while(n){
    if(n%10==7) return false;
    n/=10;
  }
  return true;
}

int main(){
  int n,sum;
  while(cin>>n){
    sum=0;
    for(int i=1;i<=n;i++){
      if(notRefre(i))  sum+=i*i;
    }
    cout<<sum<<endl;
  }
  return 0;
}      

問題 M: 雞兔同籠

時間限制: 1 Sec  記憶體限制: 32 MB

送出: 144  解決: 121

[​​​送出​​​][​​狀态​​​][​​讨論版​​][命題人:外部導入]

題目描述

一個籠子裡面關了雞和兔子(雞有2隻腳,兔子有4隻腳,沒有例外)。已經知道了籠子裡面腳的總數a,問籠子裡面至少有多少隻動物,至多有多少隻動物。

輸入

第1行是測試資料的組數n,後面跟着n行輸入。每組測試資料占1行,每行一個正整數a (a < 32768)

輸出

樣例輸入

2
18
5      

樣例輸出

5 9
0 0      

提示

這個問題可以描述成任給一個整數 N,如果N 是奇數,輸出0 0,否則如果N 是4 的倍數,

輸出N / 4 N / 2,如果N 不是4 的倍數,輸出N/4+1 N/2。這是一個一般的計算題,

隻要實作相應的判斷和輸出代碼就可以了。題目中說明了輸入整數在一個比較小的範圍内,

是以隻需要考慮整數運算就可以了。 

分析一下很簡單,循環都不要,O(1)的算法      
#include<iostream>     
using namespace std;
int main(){
  int x,y,z,a;
  int T;
  cin>>T;
  while(T--){
    cin>>a;
    if(a%2!=0) cout<<"0 0\n";
    else if(a%4==0){
      cout<<a/4<<" "<<a/2<<endl;
    }else{
      cout<<a/4+1<<" "<<a/2<<endl;
    }
  }
  return 0;
}