1.判断回文数
#include <stdio.h>
#include <stdlib.h>
int reNumber(int n,int m);
int main()
{
int j=0;
while(!j){
int n=0,m;
printf("请输入数字和要按什么进制展开\n");
scanf("%d %d",&n,&m);
int judge=reNumber(n,m);
printf("%s\n",judge?"yes":"No");
printf("0继续判断,任意键退出\n");
scanf("%d",&j);
}
return 0;
}
int reNumber(int n,int m){
if(n<0,0)return 0;
int team=0,x=n;
while(x){
team=team*m+x%m;
x/=m;
}
return team==n;
}
解释一下
while(x){
team=team*m+x%m;
x/=m;
}
m为进制
x为原来的数,team为后来翻转后的数
team=team*m+x%m
是指team往左移一位加上x最后一位
x/=m
是使x往右移一位后循环再成为team的最后一位
这样就把x的最低位变成team的最高位当x/m为0时说明全部位数都在team上
最终实现翻转
2.找倆数的最大公约数和最小公倍数
#include <stdio.h>
int gcd(int a,int b);
int main(){
int a,b,x;
while (~scanf("%d %d",&a,&b)){
getchar();//防止错误输入导致不停循环
printf("%d 和 %d的最大公约数为%d\n",a,b, x=gcd(a,b));//辗转相除法结果
printf("%d 和 %d的最小公倍数为%d\n",a,b,clm(x,a,b));
}
return 0;
}
int gcd(int a,int b){//最大公约数求法
return (b?gcd(b,a%b):a);//辗转相除法
}
int clm(int x,int a, int b){//最小公倍数求法
return (a*b)/x;
}
证明一下辗转相除的正确性
证明gcd(a,b)==gcd(b,a%b)
设a和b的最大公约数为r
有a=xr,b=yr;(可得x与y的最大公约数为1)-------1
a%b=a-kb,即xr-kyr=r(x-ky);(k为a/b向下取整)
要证gcd(b,a%b)==r
即证y与x-ky最大公约数为1
设y与x-ky最大公约数为d
y=md,x-ky=nd
x=nd+ky=nd+Kmd=d(n+km)
由标记的1处可知x和y的最大公约数为1所以d=1,即证
2.证明最小公倍数为ab/gcd(a,b);
因为设a=xr,b=yr;
则ab最小公倍数为xyr
因为xyr可写为ay或bx
所以得证
3.找三,五,六边型数(通过二分查找法提高查找效率)
#include <stdio.h>
#include <stdlib.h>
int pentageonal(int n);
int triangle(int n);
int heaxgonal(int n);
int binary_search(int (*arr)(int),int n,int x);
int main(){
int n=0;
while (1){
n++;
int team=heaxgonal(n);//这里通过六边形数来去找其他满足的数
if(binary_search(triangle,team,team)!=EOF){
if(binary_search(pentageonal,team,team)!=EOF){
printf("%d",team);
break;
}
}
}
return 0;
}
int pentageonal(int n){
return n*(3*n-1)>>1;
}
int triangle(int n){
return n*(n+1)>>1;
}
int heaxgonal(int n){
return n*(2*n-1);
}
int binary_search(int (*arr)(int),int n,int x){//二分查找法
int head=1,tail =n,mid;
while(head<=tail){
mid=(head+tail)>>1;
if(arr(mid)==x)return mid;
else if(arr(mid)<x)
head=mid+1;
else if(arr(mid)>x)
tail=mid-1;
}
return -1;
}
后续遇见好题还会分享