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: 4611686014132420609,a=4+686+132+609 = 1431 、 b=611+014+420 = 1045 ,1431-1045=386非7倍數}
  {範例2: 200560490130,a=560+130 = 690 、 b=200+490 = 690 ,690-690= 0是7的倍數}
| 
範例輸入 | 
範例輸出 | 
說明 | 
| 
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)之間共有幾首?
最高的次數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兩次、5及3各三次} | 
#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個質數是?
   讀入一個正整數k,k<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;
}
沒有留言:
張貼留言