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