2016年6月24日 星期五

u031~u036參考


u031:字串中的阿拉伯數字
   讀入一列字串「含數字、英文字母」請挑出數字並印出
範例輸入
範例輸出
說明
A23xyc56
2356
依序輸出數字2356
89fHK71d
8971
依序輸出數字8971

#include <iostream>
using namespace std;
int main(void)
{
    int i,j,k , n;
    string s;
    cin >> s;
   n = s.size();
    for( i=0; i<n; ++i )
    {
            char  c = s[i];
            if(c>='0' && c<='9') cout << c ;
    }
    cout << endl;
    return 0;
}

u032:字串中的隱藏算式
   讀入一列字串「含數字、英文字母及1個運算符號{+-*}」請挑出數字並印出算式結果
   {註:運算符號只有一個,且一定在兩組數字之間,左右兩組數字皆為正整數<10000
範例輸入
範例輸出
說明
A23x*yc56
1288
23*56 = 1288
89fH+K71d
160
89+71 = 160

#include <iostream>
using namespace std;
int main(void)
{
    int i,j,k , n;
    string s;
    cin  >> s ;
   n = s.size();
   for(i=0; i<n; ++i)
     if(s[i]=='+' || s[i]=='-' || s[i]=='*' ) break;
   k=i+1;
   int a=0;
    for( i=0; i<k-1; ++i )
    {
            char c = s[i];
            if(c>='0' &&  c<='9') a = a*10+ c-'0';
    }

   int b=0;
    for( i=k; i<n; ++i )
    {
            char c = s[i];
            if(c>='0' &&  c<='9')  b = b*10+ c-'0';
    }
    char op = s[k-1];
   if(op == '+' ) cout << a+b << endl;
   else if(op == '-' ) cout << a-b << endl;
   else if(op == '*' ) cout << a*b << endl;
   system("pause");
    return 0;
}

u033:判斷是否被7整除
   讀入一列字串「只含數字」,但長度最多50位,請問該正整數是否可被7整除,是印Y、否印N
   {註:將數字每3位分節,奇數節和(設為a)與偶數節和(設為b),若a,b的差可被7整除即為7的倍數}
  {範例1: 4611686014132420609a=4+686+132+609 = 1431 b=611+014+420 = 1045 1431-1045=3867倍數}
  {範例2: 200560490130a=560+130 = 690 b=200+490 = 690 690-690= 07的倍數}
範例輸入
範例輸出
說明
4611686014132420609
N
如上
200560490130
Y
0是算是七的倍數

#include <iostream>
#include <cmath>
using namespace std;
int main(void)
{
    int i,j,k , n;
    string s;
    cin  >> s ;
   n = s.size();
   int a=n%3 , b=1;
   int odd=0 , even=0;
   if(a>0) odd = s[0]-'0';
   if(a>1) odd= odd*10 +s[1]-'0';
   if(odd) b=0; //多的1位或兩位放在 odd , 接著放在 even
   for(i=a; i<n; i+=3)
   {
      int num = 0;
        for( j=0; j<3; ++j )
                num = num*10 + ( s[i+j]-'0' );
                 if(b) odd += num;
                 else even += num;
                 b = 1-b;
   }
   if(abs(odd-even)%7==0)  cout << "Y" << endl;
   else cout << "N"  << endl;
   system("pause");
   return 0;
}



u034:阿華民國發票統一編號的驗證
   讀入一列字串「只含數字、字母最長9位」,就是阿華民國發票統一編號,請檢查是否正確,是則印T、否則印F
  檢查規則: () 長度:共八位,全部為數字型態;  () 計算公式:如下說明
1、各數字分別乘以 1,2,1,2,1,2,4,1;若相乘結果大於等於10將十位及個位數再相加,重複至只剩1
2、以上八個乘積處理後的8個數字相加的和看是否可被10整除,是則是正確的編號。
範例輸入
範例輸出
說明
123456789
F
長度為8
a1234567
F
有非數字
12345675
T
1 + 4 + 3 + 8 + 5 + 3 + 1 + 5 =30 { 6x2=12=(1+2)=3 , 7x4=28(=>2+8=10)=>(1+0)}

#include <iostream>
using namespace std;
int main()
{
  int i,j,k , n;
  string s;
  cin >> s;
  n = s.size();
  int two[]  = {0,2,4,6,8,1,3,5,7,9}; // *2
  int four[] = {0,4,8,3,7,2,6,1,5,9}; // *4
  if( n!=8 ) //長度非 8
      cout << "F" << endl;
  else
  {
     for(i=0; i<8; ++i)  // 是否為數字
     {
        int c=s[i]-'0';
        if(c<0 || c>9) break;        
     }
     if( i<8 ) cout << "F" << endl; //非全為數字
     else
     {    //算檢查碼 sum
         int sum = s[0]+s[2]+s[4]+s[7] - 4*int('0');  // * 1
         for(i=1; i<6; i+=2)  // *2
         {
            int c=s[i]-'0';
            sum += two[c];
         }
         sum += four[ s[6]-'0' ];   // 7 * 4
         if( sum%10==0 ) cout << "T" << endl;
         else cout << "F" << endl;
     }
  }
  system("pause");
  return 0;
}

u035:中間選區
  上次b005的熱門點播你點了沒,這次我們要調查中間的共有幾首,所有點播的曲號中
最高的次數a及最低的次數b,問點播次數為(a-1) ~ (b+1)之間共有幾首?
  輸入一個正整數n {n<100},代表有n個點播曲號{1~999999999 },輸出一個正整數,
代表中間選區有幾首
範例輸入
範例輸出
說明
8
1 1 1 1 2 3 3 3
1
a最高為4次,b最低為1
中間2~3次的有1
14
1 4 1 4 1 5 1 5 2 3 3 6 3 5
3
a最高為4次,b最低為1
中間2~3次的有3{3,4,5}
{4兩次、53各三次}

#include <iostream>
using namespace std;
int main()
{
  int i,j,k,n;
  int  nam[100] , cnt[100]={0};
  int ai=0 ; // 有幾個不同的曲號
  cin >> n;
  for(i=0; i<n; ++i)
  {
     cin >> k;
     for(j=0; j<ai; ++j)  //是否出現過
        if( k == nam[j] ) break;
    if(j==ai)  nam[ai++] = k;
    cnt[j] += 1;
  }
  int a=cnt[0] , b=cnt[0];
  for(j=1; j<ai; ++j)
  {
    if(cnt[j]>a) a=cnt[j];
    if(cnt[j]<b) b=cnt[j];
  }
  int c=0;
  for(j=0; j<ai; ++j)
    if(cnt[j]>b && cnt[j]<a) ++c;
  cout << c << endl;
  system("pause");
  return 0;
}

u036:第k個質數是?
   讀入一個正整數kk<50,輸出一個正整數為第k個質數
範例輸入
範例輸出
說明
1
2
1~5個質數是2,3,5,7,11
10
29
6~10個質數是13,17,19,23,29
46
199
46質數是199



#include <iostream>
using namespace std;
int main()
{
  int i,j,k;
  int c[500];
  for(i=0; i<500; ++i) c[i]=1; // 1質數、0非質數
  c[0] = c[1] = 0;  // 0 , 1 不算
  int cnt = 0;  // 2 開始算的個數
  cin >> k;
  for( i=2; i<500; ++i)
  {
    if( c[i]==1 )
    {
       cnt++;   
       if( cnt == k ) break;  //找到第 k , 其值為 i
       for(j=i*i; j<500; j+=i) c[j]=0;
    }    
  }
  cout << i << endl;
  system("pause");
  return 0;
}

0 意見:

張貼留言