源于《2013年王道论坛计算机考研机试指南》与牛客网计算机考研复试上机题
1.%运算符
KY133 还是A+B
#include<iostream>
#include<algorithm>
using namespace std;
int pos[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
int main(){
int a,b,k;
while(scanf("%d %d %d",&a,&b,&k)!=EOF){
if(a==0&&b==0)break;
if(a%pos[k]==b%pos[k])printf("-1\n");
else printf("%d\n",a+b);
}
return 0;
}
KY217 守形数
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,pos;
while(scanf("%d",&n)!=EOF){
if(n>10)pos=100;
else pos=10;
if((n*n)%pos==n){
printf("Yes!\n");
}else{
printf("No!\n");
}
}
}
2.数位拆解
KY18 特殊乘法
#include<iostream>
#include<algorithm>
using namespace std;
int cura[20],curb[20];
int main(){
int a,b,lena=0,lenb=0;
while(scanf("%d %d",&a,&b)!=EOF){
while(a){
cura[lena++]=a%10;
a/=10;
}
while(b){
curb[lenb++]=b%10;
b/=10;
}
int sum=0;
for(int i=0;i<lena;i++){
for(int j=0;j<lenb;j++){
sum+=cura[i]*curb[j];
}
}
printf("%d\n",sum);
}
}
KY266 反序数
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
for(int i=1000;i<=(10000/9);i++){
int tmp=i,pos=0,num=0;
while(tmp){
num=num*10+tmp%10;
tmp/=10;
}
if(num==9*i)printf("%d\n",i);
}
return 0;
}
KY275 对称平方数
#include<iostream>
#include<algorithm>
using namespace std;
int pos[20];
int main(){
for(int i=1;i<256;i++){
int sq=i*i,cur=0;
while(sq){
pos[cur++]=sq%10;
sq/=10;
}
int mid=cur/2,flag=1;
for(int i=0;i<mid;i++){
if(pos[i]!=pos[cur-i-1]){
flag=0;
break;
}
}
if(flag)printf("%d\n",i);
}
return 0;
}
KY72 Digital Roots
#include<iostream>
#include<algorithm>
using namespace std;
int convert(int a){
int sum=0;
while(a){
sum+=a%10;
a/=10;
}
return sum;
}
int main(){
int num;
while(scanf("%d",&num)!=EOF){
if(num==0)break;
while(num/10){
num=convert(num);
}
printf("%d\n",num);
}
return 0;
}
3.进制转换
★KY135 又一版 A+B
#include<iostream>
#include<algorithm>
using namespace std;
void convert(long long int num,long long int order){
int pos[30],cur=0;
while(num){
pos[cur++]=num%order;
num/=order;
}
if(cur==0)printf("0\n");
else{
for(int i=cur-1;i>=0;i--){
printf("%d",pos[i]);
}
printf("\n");
}
}
int main(){
long long int order,a,b;
while(scanf("%ld",&order)!=EOF){
if(order==0)break;
scanf("%ld %ld",&a,&b);
convert(a+b,order);
}
return 0;
}
KY56 数制转换
#include<iostream>
#include<algorithm>
using namespace std;
int convert(char s){
if(s>='0'&&s<='9')return s-'0';
if(s=='a'||s=='A')return 10;
if(s=='b'||s=='B')return 11;
if(s=='c'||s=='C')return 12;
if(s=='d'||s=='D')return 13;
if(s=='e'||s=='E')return 14;
if(s=='f'||s=='F')return 15;
}
void convert2(int num,long long int order){
int pos[30],cur=0;
while(num){
pos[cur++]=num%order;
num/=order;
}
if(cur==0)printf("0\n");
else{
for(int i=cur-1;i>=0;i--){
if(pos[i]>=0&&pos[i]<=9)printf("%d",pos[i]);
if(pos[i]==10)printf("A");
if(pos[i]==11)printf("B");
if(pos[i]==12)printf("C");
if(pos[i]==13)printf("D");
if(pos[i]==14)printf("E");
if(pos[i]==15)printf("F");
}
printf("\n");
}
}
char str[30];
int main(){
int a,b,num=0;
scanf("%d %s %d",&a,&str,&b);
for(int i=0;str[i]!=NULL;i++){
num=num*a+convert(str[i]);
}
convert2(num,b);
return 0;
}
better:
#include<iostream>
#include<algorithm>
using namespace std;
int convert(char s){
if(s>='0'&&s<='9')return s-'0';
else if(s>='a'&&s<='z')return s-'a'+10;
else if(s>='A'&&s<='Z')return s-'A'+10;
}
void convert2(int num,long long int order){
int pos[30],cur=0;
while(num){
pos[cur++]=num%order;
num/=order;
}
if(cur==0)printf("0\n");
else{
for(int i=cur-1;i>=0;i--){
if(pos[i]>=0&&pos[i]<=9)printf("%d",pos[i]);
else printf("%c",'A'+pos[i]-10);
}
printf("\n");
}
}
char str[30];
int main(){
int a,b,num=0;
scanf("%d %s %d",&a,&str,&b);
for(int i=0;str[i]!=NULL;i++){
num=num*a+convert(str[i]);
}
convert2(num,b);
return 0;
}
KY235 进制转换2
#include<iostream>
#include<algorithm>
using namespace std;
int convert(char s){
if(s>='0'&&s<='9')return s-'0';
else if(s>='a'&&s<='z')return s-'a'+10;
else if(s>='A'&&s<='Z')return s-'A'+10;
}
void convert2(long long int num,int order){
int pos[30],cur=0;
while(num){
pos[cur++]=num%order;
num/=order;
}
if(cur==0)printf("0\n");
else{
for(int i=cur-1;i>=0;i--){
if(pos[i]>=0&&pos[i]<=9)printf("%d",pos[i]);
else printf("%c",'A'+pos[i]-10);
}
printf("\n");
}
}
char x[30];
int main(){
int m,n;
long long int num=0;
scanf("%d %d",&m,&n);
scanf("%s",&x);
for(int i=0;x[i]!=NULL;i++){
num=num*m+convert(x[i]);
}
convert2(num,n);
return 0;
}
KY230 八进制
#include<iostream>
#include<algorithm>
using namespace std;
void convert(int n){
int pos[20],cur=0;
while(n){
pos[cur++]=n%8;
n/=8;
}
if(cur){
for(int i=cur-1;i>=0;i--){
printf("%d",pos[i]);
}
printf("\n");
}else{
printf("0\n");
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
convert(n);
}
}
4.最大公约数
KY161 最大公约数
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b){
if(a==0)return b;
if(b==0)return a;
return gcd(b,a%b);
}
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}
KY239 最大公约数1
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b){
if(a==0)return b;
if(b==0)return a;
return gcd(b,a%b);
}
int main(){
int n,min,max,cur;
while(scanf("%d",&n)!=EOF){
int pos[n];
min=0x3fffffff,max=-1;
for(int i=0;i<n;i++){
scanf("%d",&pos[i]);
if(pos[i]>max)max=pos[i];
if(pos[i]<min)min=pos[i];
}
printf("%d %d %d\n",min,max,gcd(min,max));
}
return 0;
}
5.最小公倍数
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b){
return b!=0?gcd(b,a%b):a;
}
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",a*b/gcd(a,b));
return 0;
}
6.素数筛法
KY163 素数判定
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
bool isSingle(int num){
bool flag=true;
if(num<=1)return false;
for(int i=2;i<=sqrt(num);i++){
if(num%i==0){
flag=false;
break;
}
}
return flag;
}
int main(){
int n;
scanf("%d",&n);
if(isSingle(n))printf("yes\n");
else printf("no\n");
return 0;
}
KY183 素数
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int pos[10010],res[1010];
void convert(int n){
for(int i=2;i<n;i++){
if(pos[i])continue;
for(int j=2;j<=sqrt(i);j++){
if(i%j==0){
pos[i]=1;
int tmp=n;
for(int k=2;k*i<n;k++){
pos[k*i]=1;
}
break;
}
}
}
}
int main(){
int n,cur=0;
scanf("%d",&n);
convert(n);
for(int i=2;i<n;i++){
if(pos[i]==0&&i%10==1)res[cur++]=i;
}
for(int i=0;i<cur-1;i++){
printf("%d ",res[i]);
}
printf("%d",res[cur-1]);
return 0;
}
better:
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int pos[10010],res[1010];
void convert(int n){
int size=0;
for(int i=2;i<n;i++){
if(pos[i])continue;
for(int j=2*i;j<=n;j+=i){
pos[j]=1;
}
}
}
int main(){
int n,cur=0;
scanf("%d",&n);
convert(n);
for(int i=2;i<n;i++){
if(pos[i]==0&&i%10==1)res[cur++]=i;
}
if(cur==0)printf("-1\n");
else{
for(int i=0;i<cur-1;i++){
printf("%d ",res[i]);
}
printf("%d\n",res[cur-1]);
}
return 0;
}
KY110 Prime Number
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int pos[110000],res[10010];
void convert(int n){
for(int i=2;i<n;i++){
if(pos[i])continue;
for(int j=2*i;j<=n;j+=i){
pos[j]=1;
}
}
}
int main(){
int n,cur=0;
convert(110000);
for(int i=2;i<110000;i++){
if(pos[i]==0)res[cur++]=i;
}
while(scanf("%d",&n)!=EOF){
printf("%d\n",res[n-1]);
}
return 0;
}
7.分解素因数
★KY7 质因数的个数
1.先用素数筛子求出sqrt(1e9)+1内的所有的素数(取根号是因为一个数n所有质因数中只有一个大于sqrt平方的)。
2.依次对给定的数n除以他的质因数,如果除到了1,说明除尽了,如果没除到1,就将素数筛子里的数向后移一位判断。
3.如果最后都判断完了,n仍!=1,说明存在一个大于他的根号的因数,那么加一即可。
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
bool pos[100001];
int res[100001],cur=0;
void convert(int n){
for(int i=2;i<n;i++){
if(pos[i])continue;
res[cur++]=i;
for(int j=2*i;j<=n;j+=i){
pos[j]=true;
}
}
}
int main(){
int n,count=0;
convert(100001);
while(scanf("%d",&n)!=EOF){
while(n!=1){
int tmp=n;
for(int i=0;res[i]<=n&&i<cur;i++){
if(n%res[i]==0){
count++;
n/=res[i];
break;
}
}
if(tmp==n){
count++;
break;
}
}
printf("%d\n",count);
}
return 0;
}
better:
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
bool pos[100001];
int res[100001],cur=0;
void convert(int n){
for(int i=2;i<n;i++){
if(pos[i])continue;
res[cur++]=i;
for(int j=2*i;j<=n;j+=i){
pos[j]=true;
}
}
}
int main(){
int n;
convert(100001);
while(scanf("%d",&n)!=EOF){
int ansNum[100],ansPrime[100],sum=0,count=0;
for(int i=0;i<cur;i++){
if(n%res[i]==0){
ansPrime[count]=res[i];
ansNum[count]=0;
while(n%res[i]==0){
ansNum[count]++;
n/=res[i];
count++;
}
}
if(n==1)break;
}
if(n!=1){
ansPrime[count]=n;
ansNum[count++]=1;
}
for(int i=0;i<count;i++){
sum+=ansNum[i];
}
printf("%d\n",sum);
}
return 0;
}
★★KY105 整除问题
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int pos[100001],res[100001],cur=0;
int numN[100001],numA[100001],countN=0;
void convert(int n){
for(int i=2;i<n;i++){
if(pos[i])continue;
res[cur++]=i;
for(int j=2*i;j<=n;j+=i){
pos[j]=true;
}
}
}
void cal(int times[],int num){
for(int i=0;i<cur;i++){
if(num%res[i]==0){
if(times[i]==NULL){
times[i]=0;
countN++;
}
while(num%res[i]==0){
times[i]++;
num/=res[i];
}
}
if(num==1)break;
}
}
int main(){
convert(100001);
int n,a,min=0x3fffffff;
scanf("%d %d",&n,&a);
for(int i=2;i<=n;i++){
cal(numN,i);
}
cal(numA,a);
for(int i=0;i<countN;i++){
if(numA[i]==0)continue;
if(numN[i]/numA[i]<min)min=numN[i]/numA[i];
}
printf("%d\n",min);
return 0;
}
better:
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int pos[1010],res[1010],cur=0;
void convert(int n){
for(int i=2;i<n;i++){
if(pos[i])continue;
res[cur++]=i;
for(int j=2*i;j<=n;j+=i){
pos[j]=true;
}
}
}
int cnt1[1010],cnt2[1010];
int main(){
convert(1010);
int n,a,min=0x3fffffff;
scanf("%d %d",&n,&a);
for(int i=0;i<cur;i++){
cnt1[i]=0;
cnt2[i]=0;
}
for(int i=0;i<cur;i++){
int t=n;
while(t){
cnt1[i]+=t/res[i];
t/=res[i];
}
}
for(int i=0;i<cur;i++){
while(a%res[i]==0){
cnt2[i]++;
a/=res[i];
}
if(cnt2[i]==0)continue;
if(cnt1[i]/cnt2[i]<min)min=cnt1[i]/cnt2[i];
}
printf("%d\n",min);
return 0;
}
KY3 约数的个数
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
bool pos[100001];
int res[100001],cur=0,str[100001];
void convert(int n){
for(int i=2;i<n;i++){
if(pos[i])continue;
res[cur++]=i;
for(int j=2*i;j<=n;j+=i){
pos[j]=true;
}
}
}
int main(){
int n,num;
convert(100001);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num);
int cnt=0,sum=1;
for(int i=0;i<cur;i++){
if(num%res[i]==0){
str[cnt]=0;
while(num%res[i]==0){
str[cnt]++;
num/=res[i];
}
cnt++;
}
if(num==1)break;
}
if(num!=1)str[cnt++]=1;
for(int i=0;i<cnt;i++){
sum*=str[i]+1;
}
if(num==0)printf("1\n");
else printf("%d\n",sum);
}
return 0;
}
8.★二分求幂
if(b%2==1){
sum*=cur;
sum%=1000;
}
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
if(a==0&&b==0)break;
int sum=1,cur=a%1000;
while(b){
if(b%2==1){
sum*=cur;
sum%=1000;
}
b/=2;
cur=(cur*cur)%1000;
}
printf("%d\n",sum%1000);
}
return 0;
}
9.高精度整数
★★KY209 a+b
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
struct bigInteger{
int size;
int digit[1000];
void init(){
for(int i=0;i<1000;i++)digit[i]=0;
size=0;
}
void convert(char str[]){
int len=strlen(str),i;
for(i=len-4;i>=0;i-=4,len=i+4){
int circle=4,num=0;
while(circle--){
num=num*10+str[i+3-circle]-'0';
}
digit[size++]=num;
}
if(len<4&&len>0){
int tmp=len;
while(tmp--){
digit[size]=digit[size]*10+str[len-tmp-1]-'0';
}
size++;
}
}
}numA,numB;
char a[1001],b[1001];
int main(){
while(scanf("%s %s",&a,&b)!=EOF){
numA.init();
numB.init();
numA.convert(a);
numB.convert(b);
int flag=0,i;
int max=numA.size<numB.size?numB.size:numA.size;
for(i=0;i<max;i++){
numB.digit[i]+=numA.digit[i]+flag;
if(numB.digit[i]/10000){
numB.digit[i]%=10000;
flag=1;
}else{
flag=0;
}
}
if(flag){
numB.digit[i]+=1;
max++;
}
for(int i=max-1;i>=0;i--){
if(i==max-1)printf("%d",numB.digit[i]);
else printf("%04d",numB.digit[i]);
}
printf("\n");
}
return 0;
}
★KY24 N的阶乘
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
struct bigInteger{
int size;
int digit[1000];
void init(){
for(int i=0;i<1000;i++)digit[i]=0;
size=0;
}
void convert(int str){
while(str){
digit[size++]=str%10000;
str/=10000;
}
}
void print(){
for(int i=size-1;i>=0;i--){
if(i==size-1)printf("%d",digit[i]);
else printf("%04d",digit[i]);
}
}
bigInteger operator *(int x)const{
bigInteger tmp;
int flag=0,i;
tmp.init();
for(i=0;i<size;i++){
tmp.digit[tmp.size++]=digit[i]*x+flag;
if(tmp.digit[i]/10000){
flag=tmp.digit[i]/10000;
tmp.digit[i]=tmp.digit[i]%10000;
}else{
flag=0;
}
}
if(flag){
tmp.digit[i]+=flag;
tmp.size++;
}
return tmp;
}
}numA;
int main(){
int a;
while(scanf("%d",&a)!=EOF){
numA.init();
numA.convert(1);
for(int i=2;i<=a;i++){
numA=numA*i;
}
numA.print();
printf("\n");
}
return 0;
}
KY235 进制转换2
#include<iostream>
#include<algorithm>
using namespace std;
int convert(char s){
if(s>='0'&&s<='9')return s-'0';
else if(s>='a'&&s<='z')return s-'a'+10;
else if(s>='A'&&s<='Z')return s-'A'+10;
}
void convert2(long long int num,int order){
int pos[30],cur=0;
while(num){
pos[cur++]=num%order;
num/=order;
}
if(cur==0)printf("0\n");
else{
for(int i=cur-1;i>=0;i--){
if(pos[i]>=0&&pos[i]<=9)printf("%d",pos[i]);
else printf("%c",'A'+pos[i]-10);
}
printf("\n");
}
}
char x[30];
int main(){
int m,n;
long long int num=0;
scanf("%d %d",&m,&n);
scanf("%s",&x);
for(int i=0;x[i]!=NULL;i++){
num=num*m+convert(x[i]);
}
convert2(num,n);
return 0;
}
高精度待补充
★★KY79 浮点数加法
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
struct bigInteger{
int sizeI,sizeD;
int digit[1000];
int integer[1000];
void init(){
for(int i=0;i<1000;i++){
digit[i]=0;
integer[i]=0;
}
sizeI=sizeD=0;
}
void convert(char str[]){
int pos=0;
while(str[pos]!='.')pos++;
char str1[1000],str2[1000];
for(int i=0;i<1000;i++){
str1[i]=0;
str2[i]=0;
}
for(int i=0;i<pos;i++){
str1[i]=str[i];
}
for(int i=pos+1;i<strlen(str);i++){
str2[i-pos-1]=str[i];
}
int len=strlen(str1),i;
for(i=len-4;i>=0;i-=4,len=i+4){
int circle=4,num=0;
while(circle--){
num=num*10+str1[i+3-circle]-'0';
}
integer[sizeI++]=num;
}
if(len<4&&len>0){
int tmp=len;
while(tmp--){
integer[sizeI]=integer[sizeI]*10+str1[len-tmp-1]-'0';
}
sizeI++;
}
len=strlen(str2);
for(i=0;i<len;i+=4){
int circle=4,num=0;
while(circle--){
if(str2[i+3-circle]==NULL)str2[i+3-circle]='0';
num=num*10+str2[i+3-circle]-'0';
}
digit[sizeD++]=num;
}
}
void print(){
for(int i=sizeI-1;i>=0;i--){
if(i==sizeI-1)printf("%d",integer[i]);
else printf("%04d",integer[i]);
}
printf(".");
if(sizeD>=1){
while(digit[sizeD-1]==0){
sizeD--;
}
}
for(int i=0;i<sizeD;i++){
if(i==sizeD-1){
char last[4];
int lstcnt=0;
for(int i=0;i<4;i++){
last[i]=digit[sizeD-1]%10+'0';
digit[sizeD-1]/=10;
}
for(int i=0;i<4;i++){
if(last[i]=='0')lstcnt++;
else break;
}
for(int i=3;i>=lstcnt;i--){
printf("%c",last[i]);
}
}
else printf("%04d",digit[i]);
}
printf("\n");
}
bigInteger operator +(bigInteger x)const{
bigInteger tmp;
int flag=0,i;
tmp.init();
tmp.sizeD=sizeD>x.sizeD?sizeD:x.sizeD;
tmp.sizeI=sizeI>x.sizeI?sizeI:x.sizeI;
for(i=tmp.sizeD-1;i>=0;i--){
tmp.digit[i]=digit[i]+x.digit[i]+flag;
if(tmp.digit[i]/10000){
flag=tmp.digit[i]/10000;
tmp.digit[i]%=10000;
}else{
flag=0;
}
}
for(i=0;i<tmp.sizeI;i++){
tmp.integer[i]=integer[i]+x.integer[i]+flag;
if(tmp.integer[i]%10000){
flag=tmp.integer[i]/10000;
tmp.integer[i]%=10000;
}else{
flag=0;
}
}
if(flag)tmp.integer[tmp.sizeI++]+=flag;
return tmp;
}
}numA,numB;
char a[1000],b[1000];
int main(){
scanf("%s",&a);
numA.convert(a);
scanf("%s",&b);
numB.convert(b);
numB=numA+numB;
numB.print();
return 0;
}