关于生成回文数

"回文数"是一种数字。如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。

具体可以看百科回文数介绍 百科回文数

计算机来求多少数之间的回文数,通常采用两种方法,一种是穷举,一种是根据回文数的规律直接求值。

穷举耗时,代码简单,求规律代码多,运行快。

c实例:

/*
**author:suju.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//返回num数字的宽度位数
int digits(long num)
{
    int digits=0;
    while (num!=0){
        num=num/10;//除10得一位
        digits++;
    }
    return digits;
}
//倒序数字
int transposition(int num)
{
    int i,j=0;
    while (num!=0){
        i=num%10;
        num=num/10;
        j=j*10+i;
    }
    return j;
}
long printPalindromes(long num)
{
    long temp=0;
    long sum=9;//默认9 包括 1,2等
    int i,j;
    //小于等于10直接返回
    if (num<10){
        return num;
    }
    //取num位数折半,并pow取折半位最大数
    for (i=1;i<(float)pow(10,digits(num)/2);i++){
        //每次循环的数字位宽
        int w=(float)pow(10,digits(i));
        for (j=-1;j<=9;j++){
            //根据位宽组合回文数,中间数比左边数小一个进制位10,从-1取,表示中间数为空状态如:1001格式
            temp=i*w*(j<0?1:10)+(j>0?j:0)*w+transposition(i);
            //判断并返回
            if (temp>=num){break;}
            sum++;
        }
    }
    return sum;//返回回文数数量
}
//穷举法
void print2(long num){
long i,j,k,a,m=0,n=0;
    for(i=1;i<=num;i++)
    {
        m++;
        k=i;
        a=0;
        while(k!=0){
            j=k%10;
            k=k/10;
            a=a*10+j;
        }
        if (a==i){
            n++;
        }
    }
    printf("%d\n",n);//回文数数量
}
//测试时间
int main()
{
    //设置时间,并执行2个生成回文数函数。
    time_t tp,tp2;
    time(&tp);//运行前时间
    printf("%s%ld\n","sum:",printPalindromes(859435));
    time(&tp2);
    //打印运行后时间
    printf("%ld\n",tp2-tp);
    time(&tp);
    print2(859435);
    time(&tp2);
    printf("%ld\n",tp2-tp);
    return 0;
}

codeblocks下编译通过,codeblocks gcc编译器 long是4字节,更长字节自己可以测试 long long是8字节。

因为求规律是折半求值,所以千万位数量上时间也很小,穷举法在千万位数量上比较耗时。不过穷举法简答,精巧。(上述求回文数,包括了1-9)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值