ACM札记四
0x1互逆素数
若将某一素数的各位数字的顺序颠倒后得到的数仍是素数,则此素数称为可逆素数。
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 |
#include <stdio.h> #include <math.h> int getrnum(int num){ int rnum=0; do{ rnum *= 10; rnum = rnum + num%10; }while((num/=10)!=0); return rnum; } int sushu(int num){ int i,k; k = (int)sqrt((double)num); for(i=2;i<=k;i++){ if(num%i==0) break; } if(i<k) return 0;//返回值为0表示不为素数 else return 1; } void keni(int num){ int flag,rnum; flag = sushu(num); if(flag == 0) printf("no\n"); else{ rnum = getrnum(num); flag = sushu(rnum); if(flag == 0) printf("no\n"); else printf("yes\n"); } } int main(){ int num,rnum; scanf("%d",&num); keni(num); getchar(); return 0; } |
在不知道位数的情况下得到一个整数的逆序数。
1 2 3 4 5 6 7 8 9 |
int getrnum(int num){ int rnum=0; do{ rnum *= 10; rnum = rnum + num%10; }while((num/=10)!=0); return rnum; } |
判断某整数是否为素数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//头文件<math.h> int sushu(int num){ int i,k; k = (int)sqrt((double)num); for(i=2;i<=k;i++){ if(num%i==0) break; } if(i<k) return 0;//返回值为0表示不为素数 else return 1; } |
0x2 求数字的各个位数的和
运用数组,可以取数字的每位数。
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 sum(int x) { int i=0,s[8],sum=0; do { s[i++]=x%10; } while((x/=10)>0); for(;i>0;i--) sum+=s[i-1]; return sum; } int main() { int num; cin>>num; cout<<sum(num); } |
>
0x3数组交换
输入一个正整数n(1 <n≤10),再输入n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n 个数。
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 |
#include <iostream> using namespace std; int main() { int i,n; int a[10]; cout<<"Input n: "; cin>>n; cout<<"Input "<<n<<" integers: ";; for(i=0; i<n; i++) { cin>>a[i]; } int s,p,j; s=a[0]; p=0; for(j=1; j<n; j++) { if(s<a[j]) { s=a[j]; p=j; } } a[p]=a[n-1]; a[n-1]=s; s=a[0]; p=0; for(j=1; j<n; j++) { if(s>a[j]) { s=a[j]; p=j; } } a[p]=a[0]; a[0]=s; cout<<"After swapped: "; for(i=0; i<n; i++) { cout<<a[i]<<" "; } return 0; } |
0x4同构数
同构数是其平方数的尾数等于该数自身的自然数,例如:25×25=625。从键盘输入一个不大于10000的自然数,判断其是否是同构数并按样例格式输出。
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; cin>>a; int b=a*a-a; int c=a,d=b; while((c=c/10)!=0) { if(d%10!=0) { cout<<a<<" no,"<<a<<"*"<<a<<"="<<a*a; return 0; } d=d/10; } if(d%10!=0) cout<<a<<" no,"<<a<<"*"<<a<<"="<<a*a; else cout<<a<<" yes,"<<a<<"*"<<a<<"="<<a*a; return 0; } |
0x5奇数输出
将一个整数中的每一位上为奇数的数依次取出,构成一个新数并输出。高位仍在高位,低位仍在低位。
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; void function(int x) { if(x==0) return; function(x/10); if(x%2!=0&&x>0) cout<<x%10; else if(x%2!=0&&x<0) cout<<-x%10; } int main() { int x; cin>>x; if(x>0) function(x); else { cout<<"-"; function(x); } }#include <iostream> #include <cstring> using namespace std; int main() { char s1[100],s2[10]; int i,j,k,len1,len2,b[10]; gets[s1]; gets[s2]; len1=strlen(s1); len2=strlen(s2); for(i=0,k=0; i<len1; i++) { for(j=0; j<len2; j++) if(s1[i+j]!=s2[j]) break; if(j>=len2) b[k++]=i+1; //i从0开始计数的,所以位置是i+1 } cout<<k<<endl; //k为s2在s1中出现的次数 for(i=0; i<k; i++) cout<<b[i]<<" "; //返回s2在s1中的位置,可能有多个 cout<<endl; return 0; } |
0x6 字符串查询
在一个字串s1中查找一子串s2,若存在则返回s1中s2的个数和位置。
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 |
#include <iostream> #include <cstring> using namespace std; int main() { char s1[100],s2[10]; int i,j,k,len1,len2,b[10]; gets[s1]; gets[s2]; len1=strlen(s1); len2=strlen(s2); for(i=0,k=0; i<len1; i++) { for(j=0; j<len2; j++) if(s1[i+j]!=s2[j]) break; if(j>=len2) b[k++]=i+1; //i从0开始计数的,所以位置是i+1 } cout<<k<<endl; //k为s2在s1中出现的次数 for(i=0; i<k; i++) cout<<b[i]<<" "; //返回s2在s1中的位置,可能有多个 cout<<endl; return 0; } |
0x7泰勒展开式
用exp(x)的泰勒级数前15项之和近似计算并输出exp(x)的值,实数x从键盘输入。级数表达式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> using namespace std; int main() { float result=1,u=1,x; int i=1; cin>>x; while(i<=14) { u=u*x/i; result=result+u; i++; } cout<<result; } |
0x8格式化输出
从键盘输入一个正整数,将该数乘2的积按3位一逗的格式输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <stdio.h> #include <stdlib.h> main() { unsigned long n; int a[10],i; scanf("%ld",&n); n*=2; for(i=0; n>0; i++) { a[i]=n%1000; n/=1000; } for(i--; i>=0; i--) printf("%d%c",a[i],i!=0?',':' '); } |
0x9统计字符串数目
输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符的个数。
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 |
#include <iostream> #include <cstdio> using namespace std; int main() { char s[100],a; int i,b,c,d,e,f; i=0; b=0; c=0; d=0; e=0; f=0; cout<<"Input a string:"; gets(s); while(s[i]!='\0') { a=s[i]; if(a>='A'&&a<='Z') b=b+1; else if(a>='a'&&a<='z') c=c+1; else if(a==' ') d=d+1; else if(a>='1'&&a<='9') e=e+1; else f=f+1; i=i+1; } cout<<"Number of uppercase letters is :"<<b<<endl; cout<<"Number of lowercase letters is :"<<c<<endl; cout<<"Number of spacebars is :"<<d<<endl; cout<<"Number of digits is :"<<e<<endl; cout<<"Number of other characters is :"<<f<<endl; } |
0x9求和
输入2个正整数a和n,求a+aa+aaa+aa…a(n个a)之和。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> using namespace std; int main() { int a,n,s=0; cout<<"Input a, n: "; cin>>a>>n; while(n>=0) { s=a*n+s; a=a*10; n--; } cout<<"s="<<s<< endl; return 0; } |
0x10最近素数
从键盘输入一个大于2的正整数n,求解并输出大小最接近n的素数(不包括n)。
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 |
#include <iostream> #include <cmath> using namespace std; //判断素数 int isprime(int x) { int i; if(x<2) return 0; for(i=2; i<sqrt(x); i++) if(x%i==0) return 0; return 1; } int main() { int i,a,b,n; cin>>n; for(a=n+1; !isprime(a); a++); //不是素数就跳过,是素数就结束循环。 for(b=n-1; !isprime(b); b--); if(a-n<n-b) cout<<a<<endl; else if(a-n==n-b) cout<<a<<" "<<b<<endl; else cout<<b<<endl; return 0; } |