noip第13課作業


1.    排身高

【問題描述】

鵬鵬的班上一共有 n 個學生。剛好每個同學的身高互不相同。鵬鵬想知道,所有同學中身高第二高的是誰。

輸入格式:輸入共兩行,第一行有一個整數 n(2≤n≤100),表示有 n 個學生。第二行有 n 個用空格分開的整數 a1,……, an,依次表示每個同學的身高。ai 是不超過 200 的正整數。

輸出格式:輸出為兩個整數,中間用空格隔開, 分別表示身高第二高的同學的編號和身高。

【輸入樣例】

4

140  145  152  144

【輸出樣例】

2   145

#include<iostream>
#include<algorithm>
using namespace std;
struct student {
    int num,h;
};
student stu[101];
bool comp(student a,student b) {
    return a.h > b.h;
}
int main() {
    freopen("high.txt","r",stdin);
    freopen("highout.txt","w",stdout);
    int n;
    cin >> n;
    for(int i=1; i<=n; i++) {
        stu[i].num = i;
        cin >> stu[i].h;
    }
    sort(stu + 1,stu + n + 1,comp);
    cout << stu[2].num << " "<< stu[2].h;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

2.    大整數加法

【問題描述】

求兩個不超過200位的非負整數的和。

輸入:共2行,每行是一個不超過200位的非負整數,可能有多余的前導0。

輸出:一行,即相加后的結果。結果里不能有多余的前導0,即如果結果是342,那么就不能輸出為0342。

【樣例輸入】

22222222222222222222

33333333333333333333

【樣例輸出】

55555555555555555555

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char a1[1001]= {},b1[1001]= {};
    int a[1001]= {},b[1001]= {},c[1001]= {},lena,lenb,i;
    int lenc = 0, x = 0;
    cin>>a1>>b1;
    lena = strlen(a1);
    lenb = strlen(b1);
    for(i = 0; i <= lena-1; i++) {
        a[lena-i-1] = a1[i] - 48;
    }
    for(i = 0; i <= lenb -1; i++) {
        b[lenb-i-1] = b1[i] - 48;
    }
    while(lenc<lena||lenc<lenb) {
        c[lenc]=a[lenc]+b[lenc]+x;
        x = c[lenc]/10;
        c[lenc] = c[lenc]%10;
        lenc++;
    }
    c[lenc] = x;
    for(i = lenc; i >=0; i--) {
        if(c[i] != 0) {
            break;
        }
    }
    for( ; i >=0; i--)
        cout << c[i];
    cout << endl;

    return 0;
}

1.    大整數的減法

【問題描述】

求兩個大的正整數相減的差。

輸入:共2行,第1行是被減數a,第2行是減數b(a>b並且a,b的位數不同且不存在借位)。每個大整數不超過200位,不會有多余的前導0。

輸出:一行,即所求的差。

【樣例輸入】

9999999999999999999999999999999999999

9999999999999

【樣例輸出】

9999999999999999999999990000000000000

#include<iostream>
#include<cstring>
using namespace std;
int main() {
    char a1[256]= {},b1[256]= {};
    int a[256]= {},b[256]= {},c[256]= {};
    int lena,lenb,i,lenc = 0;
    cin>>a1>>b1;
    lena= strlen(a1);
    lenb = strlen(b1);
    for(i = 0; i <= lena-1; i++) {
        a[lena-i-1] = a1[i] - 48;
    }
    for(i = 0; i <= lenb-1; i++) {
        b[lenb-i-1] = b1[i] - 48;
    }
    while(lenc<lena||lenc<lenb) {
        if(a[lenc] < b[lenc]) {
            a[lenc]+=10;
            a[lenc+1]--;
        }
        c[lenc]=a[lenc]-b[lenc];
        lenc++;
    }
    while((c[lenc-1] == 0)&&(lenc > 0))         lenc--;
    for(i = lenc-1; i >=0; i--) {
        cout << c[i];
    }
    cout << endl;
    return 0;
}

2.    大整數的因子

【問題描述】

已知正整數k滿足2<=k<=9,現給出長度最大為30位的十進制非負整數c,求所有能整除c的k。

輸入:一個非負整數c,c的位數<=30。

輸出:若存在滿足 c % k == 0 的k,從小到大輸出所有這樣的k,相鄰兩個數之間用單個空格隔開;若沒有這樣的k,則輸出"none"。

【樣例輸入1】

30

【樣例輸出1】

2 3 5 6

【樣例輸入2】

397297374785857235

【樣例輸出2】

5

#include<iostream>
#include<cstring>
//#include<algorithm>
using namespace std;
int main() {
    int i,j,ans = 0;
    char a[31];
    cin >> a;
    for(j=2; j<=9; j++) {
        int cur = 0;
        for(i=0; i<strlen(a); i++) {
            cur = cur*10 +a[i]-'0';
            cur %= j;
        }
        if(cur == 0) {
            cout << j << " ";
            ans ++;
        }
    }
    if(ans==0) {
        cout << "none" <<endl;
    }
    return 0;
}

3.    回文數

【問題描述】

若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。

例如:對整數56,將56加65(即把56從右向左讀),得到121是一個回文數。

又如:對於整數87:
    STEP1:87+78 = 165 STEP2:165+561 = 726
    STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
    在這里的一步是指進行了一次加法,上例中最少用了4步得到回文數4884。
    寫一個程序,給定一個數N,求最少經過幾步可以得到回文數。如果在30步以內(包含30步)不可能得到回文數,則輸出“Impossible!”

輸入:一行。輸入一個整數N(N的位數少於100),用於進行加法求回文數。

輸出:一行。如果能得到回文數,輸出最少的步數M,如果30以內不可能得到,則輸出“Impossible!”

【樣例輸入1】

87

【樣例輸出1】

4

【樣例輸入2】

23445456443988173748455

【樣例輸出2】

Impossible!

#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char s[100]= {};
    cin>>s;
    int a[100]= {},b[100]= {};
    int i,lens;
    lens=strlen(s);
    for(i=0; i<lens; i++) {
        b[i]=s[i]-48;
        a[lens-1-i]=s[i]-48;
    }
    int c=0;
    for(i=0; i<lens/2; i++)
        if(a[i]!=a[lens-1-i]) {
            c=1;
            break;
        }
    if(c==0) {
        cout<<0;
        return 0;
    }
    int w=1;
    while(w<=30) {
        int x=0;
        for(i=0; i<lens; i++) {
            a[i]+=b[i]+x;
            x=a[i]/10;
            a[i]%=10;
        }
        if(x==1) {
            lens++;
            a[lens-1]=1;
        }
        int k=0;
        for(i=0; i<lens/2; i++)
            if(a[i]!=a[lens-1-i]) {
                k=1;
                break;
            }

        if(k==0) {
            cout<<w;
            return 0;
        }
        for(i=0; i<lens; i++) b[i]=a[lens-1-i];
        w++;
    }
    cout<<"Impossible!"<<endl;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM