ACM札记之一
0x1
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <cmath> using namespace std; int main() { int a,i,j,t; while (cin>>a&&a) { int b[a]; i=0; while (i<a) cin>>b[i++]; for(i=0; i<a; i++) for (j=0; j<a-i-1; j++) { if (abs(b[j])<abs(b[j+1])) { t=b[j]; b[j]=b[j+1]; b[j+1]=t; } } for(i=0; i<a-1; i++) cout<<b[i]<<" "; cout<<b[i]<<'\n'; } return 0; } |
0X2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> int main() { int n, x, a[100], i, j; while(scanf("%d%d",&n,&x)&&(n||x)) //这个的意思是当输入0 0时结束的 { for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) { if(x<a[i]) break; } for(j=0;j<i;j++) printf("%d ",a[j]); printf("%d",x); for(j=i;j<n;j++) printf(" %d",a[j]); printf("\n"); } return 0; } |
0x3
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> #include <string.h> int main() { char a[100]; int n,i,j,k,d; scanf("%d",&n); while(n--) { scanf("%s",a); d=strlen(a); for(i=0,j=0;i<d;i++) { if(a[i]>='0'&&a[i]<='9') j++; } printf("%d\n",j); } return 0; } |
0x4
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <iostream> using namespace std; int main() { int n,s[100],mix,i,j,k,x,temp; while(cin>>n&&n!=0) { for(i=1; i<=n; i++) { cin>>s[i]; } mix=s[1]; for(i=1; i<=n; i++) { if(s[i]<=mix) { mix=s[i]; x=i; } temp=s[1]; s[1]=mix; s[x]=temp; cout<<s[1]; for(i=2; i<=n; i++) { cout<<s[i]<<" "; } cout<<endl; } return 0; } } |
0x5
1 |
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include<stdio.h> int main() { int n,m,i,sum,num; while(scanf("%d %d",&n,&m)!=EOF) { num=0;sum=0; for(i=2;i<=n*2;i+=2) { sum+=i; num++; if(num==m&&(i!=n*2)) { printf("%d ",sum/num); num-=m; sum=0; } } if(sum==0&&num==0) continue; printf("%d\n",sum/num); } } |
0x6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <algorithm> using namespace std; int main() { double a[4]; int i,n; cin>>n; while(n--) { for(i=1; i<=3; ++i)//这里的++i很关键。数组从第二个元素输入 { cin>>a[i]; } sort(a+1,a+4); if(a[1]+a[2]>a[3] && a[3]-a[2]<a[1]) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; } |
0x7
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> using namespace std; int sum(int num) { int i; int sum=0; for(i=1;i<num;i++) { if(num%i==0) sum+=i; } return sum; } int main() { int i,a,b,n,k; cin>>n; for(i=1; i<=n; i++) { cin>>a>>b; k=sum(a); if(k==b) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; } |
0x8
输入20个整数,输出其中能被数组中其它元素整除的那些数组元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> using namespace std; int main() { int a[10]; int i,k,j; for(i=0;i<20;i++){ cin>>a[i]; } for(i=0;i<20;i++){ k=i; a[k]=a[i]; for(j=0;j<20;j++){ if(k==j) continue; else { if(a[k]%a[j]==0){ cout<<a[k]<<endl; break; } } } } return 0; } |
0x9
若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回文数。
给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止。给定的数本身不为回文数。
例如:87则有:
STEP1: 87+78=165
STEP2: 165+561=726
STEP3: 726+627=1353
STEP4: 1353+3531=4884
编写一个程序,输入M(12<=M<=100),输出最少经过几步可以得到回文数。如果在8步以内(含8步)不可能得到回文数,则输出0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <iostream> using namespace std; #交换数字 int reverse(int x) { int num = 0; while(x != 0) { num = x%10 +num*10; x = x/10; } return num; } #判断回文数 int judge(int x) { if(x==reverse(x)) return 1; else return 0; } int main() { int L, M; cin >> L; while(L--) { cin >> M; int cnt = 0; while(cnt <= 8) { if(!judge(M)) { M = M +reverse(M); cnt++; } else { cout << cnt << endl; break; } } if(cnt > 8) { cout << 0 << endl; } } return 0; } |