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