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;
}

猜你喜欢

转载自www.cnblogs.com/zhplovelnn/p/10383136.html