c语言经典问题(算法思想,回文数,二分查找,辗转相除)

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-k
y最大公约数为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;
}

后续遇见好题还会分享

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值