精华内容
下载资源
问答
  • C语言求回文数

    千次阅读 2019-07-30 16:03:43
    256)的其平方具有对称性质的(也称回文)。 代码如下: #include <stdio.h> int main() { int i,tem,k,a,b; for(i=1;i<256;i++) { b=i*i;//平方 for(tem=b,k=0;tem>0;tem/=10)//循环 ...

    问题描述

    打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。

    代码如下:

    #include <stdio.h>
    int main()
    {
    	int i,tem,k,a,b;
    	for(i=1;i<256;i++)
    	{
    		b=i*i;//求平方
    		for(tem=b,k=0;tem>0;tem/=10)//循环
    		{
    			a=tem%10;//从低到高位分解各数
    			k=k*10+a;//逆序组数
    		}
    		if(k==b) printf("%3d%8d\n",i,b);//逆序和正旭相等,则数位对称数字,即回文,满足条件输出
    	 } 
    }

     

    展开全文
  • c语言求回文数的三种算法的描述

    千次阅读 2019-09-22 03:27:43
    c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个; 2位的回文数有11,22,33,44,55,66,77,88,99 共9个; * 请问:n位的回文数...

    c语言求回文数的三种算法的描述

    题目描述

    • 注意:(这些回文数都没有前导0
    • 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个;
    • 2位的回文数有11,22,33,44,55,66,77,88,99 共9个;
      * 请问:n位的回文数有多少个?请编写一个递归函数来解决此问题!!!
    • 【输入形式】一行一个正整数,代表多少位
    • 【输出形式】一行一个正整数,代表回文诗的个数
    • 【样例输入】2
    • 【样例输出】9

    1671712-20190430112553796-1335361703.png

    输入:
    3
    输出:
    90

    输入:
    5
    输出:
    900

    输入:
    10
    输出:
    90000

    输入:
    8
    输出:
    9000

    输入:
    1
    输出:
    10

    思路分析

    1. 通过for循环读入这个数,通过/和%操作将这个数据逆转,然后再对比逆转后的数字是否和原数字相等

    1671712-20190430112629312-1375060081.png

    1. 通过for循环读入这个数,每次取头位一个数字和末位一个数字,依次比较这两个数字是否相等,再去掉这两个数字,直到剩下一个数字(位数为奇数)或者剩下两个数字(位数为偶数)

      1671712-20190430112647556-368858618.png

    2. 通过数学关系,直接判断位数,算出这个位数内的回文数个数;

      • 例如:99899
      • 可以把它分为两半,取前面一半998,如果是回文数,其后面一半一定是与其相应位置对应,998为3位数
        字,除第一位(不包含前导0)故与后半对应的位置那个数有9种选择(1-9)外,其他位都与相应的位置有10种
        选择(0-9)
        ,例如第二位和倒数第二位(0-9)
      • 所以可以总结出来相同的位数,位数为奇数奇数其回文数有910^(n/2)个,注意n/2是整数,位数为偶数的为
        9
        10^(n/2-1)个,所以5位数字的的回文数有91010=900个
      • 注意位数为1有10个(0-9),需要特殊处理

        代码描述

      1. 第一种思路:
      #include <stdio.h>
      #include <math.h>
      int reverse(long int i,long int *terminate)        //递归函数求数值的逆序
      {
       if (i<=0){              //递归出口
           return 1;       
       }
       else{
           *terminate*=10;     //每次乘10升位数
           *terminate+=i%10;      //加上个位
           reverse(i/10,terminate);        //递归每次规模缩小
       }
       return 1;
      }
      int main ()
      {
       int n;
       scanf ("%d",&n);            //读入一个n,表示n位整数
      long int i;        
       int count=0;
       if (n==1){               //如果等于1,则有10个(0-9都是),特殊处理;
           printf ("10");
           return 0;
       }
       for (i=pow(10,n-1);i<pow(10,n);i++){       //从第一个n位数开始(10^(n-1)),到(10^n)-1
          long int terminate=0;                //定义一个逆序目标数
           reverse(i,&terminate);              //把i和逆序目标数传入
           if (terminate==i){                  //逆序后还和原数相等,则可计数
               count++;
           }
       }
       printf ("%d",count);        //输出个数
       return 0;
      }

      1. 第二种思路:
      #include <stdio.h>
      #include <math.h>
      int judge(int i,int n)
      {
       int first,last;
       if (n<=1){          //规模减小,直到n为1(偶数)或者0
           return 1;
      
       }
       else{
           first=i/pow(10,n-1);        //头位数字
           last=i%10;                  //末位数字
           if (first!=last){           //头位末尾不一样直接退出
               return 0;
           }
           int tem=pow(10,n-1);        
       judge(i%tem/10,n-2);            //剔除头尾剩下中间,位数减二
      
       }
      }
      int main ()
      {
       int n;
       scanf("%d",&n);
       if (1==n){
           printf ("10");
           return 0;
       }
       int i;
       int count=0;
      long long  low=pow(10,n-1);      //循环入口
       long long high=pow(10,n);       //循环出口
       for (i=low;i<high;i++){
          if ( judge(i,n)==1){         //判断i是否为回文,计数
              count++;
          }
       }
       printf ("%d",count);
       return 0;
      }

      1. 第三种思路:
      #include <stdio.h>
      #include <math.h>
      int main (){
       int n;
       scanf ("%d",&n);
       int ji=9*pow(10,n/2),ou=9*pow(10,n/2-1);
       if (n==1){
           printf ("10");
       }
       else if  (n==2){
           printf ("%d",9);
       }
       else if (n%2==1){
           printf ("%d",ji);
       }
       else if (n%2==0){
           printf("%d",ou);
       }
       return 0;
      }

    额外疑问

    • 第一第二种方法当n=10的时候运算不出来,求解为何如此,是时间复杂度太高了吗?还是爆int了或者爆递归了?

    转载于:https://www.cnblogs.com/fanqieya/p/10795019.html

    展开全文
  • C语言求回文数,满足m,m*m和m*m*m均为回文数 编程求出11~999之间的回文数
  • 问题分析对于要判定的数n计算出其平方后(存于a),按照“回文数”的定义要将最高位与最低位、次高位与次低位……进行比较,若彼此相等则为回文数。此算法需要知道平方数的位数,再一一将每一位分解、比较,此方法对于...

    问题描述

    打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。

    问题分析

    对于要判定的数n计算出其平方后(存于a),按照“回文数”的定义要将最高位与最低位、次高位与次低位……进行比较,若彼此相等则为回文数。此算法需要知道平方数的位数,再一一将每一位分解、比较,此方法对于位数已知且位数不是太多的数来说比较适用。

    此问题可借助数组来解决。将平方后的(a的)每一位进行分解,按从低位到高位的顺序依次暂存到数组中,再将数组中的元素按照下标从大到小的顺序重新将其组合成一个数众(如n=15,则a=225且k=522),若k等于n×n则可判定n为回文数。

    算法设计

    从低位到高位将某一整数拆分。对于一个整数(设变量名为a)无论其位数多少,若欲将最低位拆分,只需对10进行求模运算a%10,拆分次低位首先要想办法将原来的次低位作为最低位来处理,用原数对10求商可得到由除最低位之外的数形成的新数,且新数的最低位是原数的次低位,根据拆分最低位的方法将次低位求出a/10、a%10,对于其他位上的数算法相同。

    利用这个方法要解决的一个问题就是,什么情况下才算把所有数都拆分完?当拆分到只剩原数最高位时(即新数为个位数时),再对10求商的话,得到的结果肯定为0,可以通过这个条件判断是否拆分完毕。根据题意,应将每次拆分出来的数据存储到数组中,原数的最低位存到下标为0的位置,次低位存到下标为1的位置……依次类推。

    程序段如下:

    for (i=0; a!=0; i++)

    {

    m[i] = a % 10;

    a /= 10;

    }

    将数组中元素重新组合成一新数。拆分时变量a的最高位仍然存储在数组中下标最大的位置,根据“回文数”定义,新数中数据的顺序与a中数据的顺序相反,所以我们按照下标从大到小的顺序分别取出数组中的元素组成新数k,由几个数字组成一个新数时只需用每一个数字乘以所在位置对应的权值然后相加即可,在编程过程中应该有一个变量t来存储每一位对应的权值,个位权值为1,十位权值为10,百位权值为100……,所以可以利用循环,每循环一次t的值就扩大10倍。对应程序段如下:

    for( ; i>0; i--)

    {

    k += m[i-l] * t;

    t *= 10;

    }

    下面是完整的代码:

    #include

    int main()

    {

    int m[16], n, i, t, count=0;

    long unsigned a, k;

    printf("No. number it's square(palindrome)\n");

    for( n=1; n<256; n++ ) /*穷举n的取值范围*/

    {

    k=0; t=1; a=n*n; /*计算n的平方*/

    for( i=0; a!=0; i++ ) /*从低到高分解数a的每一位存于数组m[1]~m[16]*/

    {

    m[i] = a % 10;

    a /= 10;

    }

    for(; i>0; i--)

    {

    k += m[i-1] * t; /*t记录某一位置对应的权值 */

    t *= 10;

    }

    if(k == n*n)

    printf("%2d%10d%10d\n", ++count, n, n*n);

    }

    return 0;

    }

    运行结果:

    No. number it's square(palindrome)

    1 1 1

    2 2 4

    3 3 9

    4 11 121

    5 22 484

    6 26 676

    7 101 10201

    8 111 12321

    9 121 14641

    10 202 40804

    11 212 44944

    展开全文
  • c语言求回文数的三种算法的描述题目描述注意:(这些回文数都没有前导0)1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个;2位的回文数有11,22,33,44,55,66,77,88,99 共9个;* 请问:n位的回文数有多少个...

    c语言求回文数的三种算法的描述

    题目描述

    注意:(这些回文数都没有前导0)

    1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个;

    2位的回文数有11,22,33,44,55,66,77,88,99 共9个;

    * 请问:n位的回文数有多少个?请编写一个递归函数来解决此问题!!!

    【输入形式】一行一个正整数,代表多少位

    【输出形式】一行一个正整数,代表回文诗的个数

    【样例输入】2

    【样例输出】9

    2bb40ec797e7353d369d9b67511e09d3.png

    输入:

    3

    输出:

    90

    输入:

    5

    输出:

    900

    **输入:

    10

    输出:

    90000**

    输入:

    8

    输出:

    9000

    输入:

    1

    输出:

    10

    思路分析

    通过for循环读入这个数,通过/和%操作将这个数据逆转,然后再对比逆转后的数字是否和原数字相等

    18ad011b80b0d327bae4febd28c7a3f3.png

    通过for循环读入这个数,每次取头位一个数字和末位一个数字,依次比较这两个数字是否相等,再去掉这两个数字,直到剩下一个数字(位数为奇数)或者剩下两个数字(位数为偶数)

    b0fe8b5825078e1d8e2921057f3d92ca.png

    通过数学关系,直接判断位数,算出这个位数内的回文数个数;

    例如:99899

    可以把它分为两半,取前面一半998,如果是回文数,其后面一半一定是与其相应位置对应,998为3位数

    字,除第一位(不包含前导0)故与后半对应的位置那个数有9种选择(1-9)外,其他位都与相应的位置有10种选择(0-9),例如第二位和倒数第二位(0-9)

    所以可以总结出来相同的位数,位数为奇数奇数其回文数有9*10^(n/2)个,注意n/2是整数,位数为偶数的为

    910^(n/2-1)个,所以5位数字的的回文数有910*10=900个

    注意位数为1有10个(0-9),需要特殊处理

    代码描述

    1. 第一种思路:

    #include

    #include

    int reverse(long int i,long int *terminate) //递归函数求数值的逆序

    {

    if (i<=0){ //递归出口

    return 1;

    }

    else{

    *terminate*=10; //每次乘10升位数

    *terminate+=i%10; //加上个位

    reverse(i/10,terminate); //递归每次规模缩小

    }

    return 1;

    }

    int main ()

    {

    int n;

    scanf ("%d",&n); //读入一个n,表示n位整数

    long int i;

    int count=0;

    if (n==1){ //如果等于1,则有10个(0-9都是),特殊处理;

    printf ("10");

    return 0;

    }

    for (i=pow(10,n-1);i

    long int terminate=0; //定义一个逆序目标数

    reverse(i,&terminate); //把i和逆序目标数传入

    if (terminate==i){ //逆序后还和原数相等,则可计数

    count++;

    }

    }

    printf ("%d",count); //输出个数

    return 0;

    }

    2. 第二种思路:

    #include

    #include

    int judge(int i,int n)

    {

    int first,last;

    if (n<=1){ //规模减小,直到n为1(偶数)或者0

    return 1;

    }

    else{

    first=i/pow(10,n-1); //头位数字

    last=i%10; //末位数字

    if (first!=last){ //头位末尾不一样直接退出

    return 0;

    }

    int tem=pow(10,n-1);

    judge(i%tem/10,n-2); //剔除头尾剩下中间,位数减二

    }

    }

    int main ()

    {

    int n;

    scanf("%d",&n);

    if (1==n){

    printf ("10");

    return 0;

    }

    int i;

    int count=0;

    long long low=pow(10,n-1); //循环入口

    long long high=pow(10,n); //循环出口

    for (i=low;i

    if ( judge(i,n)==1){ //判断i是否为回文,计数

    count++;

    }

    }

    printf ("%d",count);

    return 0;

    }

    3. 第三种思路:

    #include

    #include

    int main (){

    int n;

    scanf ("%d",&n);

    int ji=9*pow(10,n/2),ou=9*pow(10,n/2-1);

    if (n==1){

    printf ("10");

    }

    else if (n==2){

    printf ("%d",9);

    }

    else if (n%2==1){

    printf ("%d",ji);

    }

    else if (n%2==0){

    printf("%d",ou);

    }

    return 0;

    }

    额外疑问

    第一第二种方法当n=10的时候运算不出来,求解为何如此,是时间复杂度太高了吗?还是爆int了或者爆递归了?

    展开全文
  • c语言求回文数的三种算法的描述题目描述注意:(这些回文数都没有前导0)1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个;2位的回文数有11,22,33,44,55,66,77,88,99 共9个;* 请问:n位的回文数有多少个...
  • C语言求最近回文数

    2020-03-25 10:47:20
    输入一个不大于1e4的正整数,输出最接近它的回文,如果同时有两个都一样接近,就输出较小的。 “最近的”说明绝对差值是最小的。 #include <stdio.h> #include <math.h> int inspect(int x) //写一...
  • C语言回文数

    2019-09-26 01:59:21
    当年看郝斌讲解的C语言,回文数,哈哈,后续会分享我当年跟着他学习的数据结构代码 ...//技能: 求回文数的核心代码掌握 学会试数,像计算机一样去执行,别管为什么(看懂一个看不懂的程序的不二法门)...
  • C语言——[a,b]内的所有回文数

    千次阅读 2017-10-17 23:58:41
    输出:该区间内所有回文 #include #include int main() {  int a,b;  int i,j,k,n,s,sum;  int m[9]={0};    scanf("%d%d",&a,&b);    for(i=a;i  {  n=i;k=0;  while(n
  • #pragma mark 一个整数是否为回文 #include int main() {  long num;  int array[10];  scanf("%ld", &num);  int n = num, k = 0;  do {  array[k] = n%10;  k++;  n = n/10; /...
  • 题目: 编写一个函数,一个数字是否是...(2)再用首位数字和末尾数字进行判断,如果不相等,直接判断不是回文数,如果相等那么再将首位数字和末尾数字去除,再循环上述方法进行判断 源码: 运行结果如下: ...
  • c语言求1000至9999之间的回文

    千次阅读 2019-01-04 14:02:55
    “回文数”是指正读反读都一样的数字;如1221,1331,1111等;以下是两种求回文数的方法 第一种方法: 我们可以利用两个for来实现这个功能 第二种方法: 定义两个字符型变量,直接输出字符型变量  ...
  • 记得刚学编程时,老师要我们用C语言编一个0~200内回文数的程序。当时有不少同学都编出来了。虽然形式上大家有点不一样,但思路都差不多的。程序大致如下: #include "stdio.h" int ishui(int n) { int m=0; int...
  • 所谓回文数,即是正序与逆序相等的一个数,如121,12321,10501等。写程序判断输入的数是否为回文数。 1.分析:表面上看,我们似乎要这么做,把各个位分离,然后把第一个数跟最后一个数比较,第二个跟倒数第二个.......
  • C语言:编回文的函数

    千次阅读 2018-11-20 13:28:54
    定义一个函数,判断数x是否为回文数,如果是则返回1,否则返回0。在主函数中调用该函数,1~n的回文数的个数。(n从键盘输入) 输入 每行输入一个正整数n。(1&lt;=n&lt;=100000) 输出 对应输入,每行输出...
  • 对于要判定的数n计算出其平方后(存于a),按照“回文数”的定义要将最高位与最低位、次高位与次低位……进行比较,若彼此相等则为回文数。此算法需要知道平方数的位数,再一一将每一位分解、比较,此方法对于位数...
  • C语言编程:一个回文

    万次阅读 2016-01-25 12:15:21
    回文数,是指正着读、反着读,都相同的数字。如:1221、13531......如果不是回文数,就再重复上述的步骤,则最终可得到回文数。如十进制数是 78,则形成回文数的过程为:78 + 87 = 165165 + 561 = 726726 + 627 =
  • 一个5位数,判断它是不是回文数,即12321是回文数,个位与万位相同,十位与千位相同 程序分析 这个题因为只有五位数,所以做起来比较简单,我们可以直接出来这个数的各个位上面的数,然后用变量保存起来,直接...
  • 算法趣题之回文数

    2019-09-30 11:48:03
    啥叫回文数:如果把某个十进制数按相反的顺序排列,得到的数和原来的数相同,则这个数就是”回文数“。例如12321就是一个回文数。 这个题目拿Ruby、JavaScript、python、Java都很容易实现,因为这些语言都提供了...
  • 3.15 我要检查一个是不是在另外两个之间,为什么if(abc)不行?  3.16 为什么如下的代码不对?inta=1000,b=1000;longintc=a*b;  3.17 为什么下面的代码总是给出0?doubledegC,degF;degC=5.0/9*(degF-32);  ...
  • C语言求回文数10<n<m<300000
  • 目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到...
  • 例如:11、121、12321等,编写程序,0到10000之间所有回文数并输出。要求每行输出10个数。 编程思路:汇编中esi相当于C语言中的i变量,eax相当于tmp变量,ecx相当于result变量,count用来统计回文数的个数。 开发...
  • 求回文数的步骤: 1)求出该数的平方; 2)判断该数的平方值是否有对称性质。 判断某个数字是否对称有一个技巧,不用判断这个数有奇数位还是偶数位:将该数的平方翻转过来,比如12345翻转成54321,如果翻转过来的值...
  • C语言编程题

    2020-12-11 17:15:54
    2.编写程序,键盘输入一组整数(最大为18位数), 判断它是不是回文数,如果一个自然数和它的个位数字 反向排列所得自然数相等,则称这个数为回文数, 例如,52425和138831是回文数,而12312非回文数;3.编写程序,输出一个n*n...
  • 220个经典C语言源码

    千次下载 热门讨论 2013-08-16 23:35:01
    019 判断回文数 020 数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较整数大小 023 指向数组的指针 024 寻找指定元素的指针 025 寻找相同元素的指针 026 阿拉伯数字转换为罗马数字 027 字符...
  • 请编程验证。(回文数就是将一个数从左向右读是一样的,如121,11等)。(注:回文数不超过2147483647) ...提示:一个函数用来反序数,另一个函数判断是否为回文数,在主函数中输入输出。 #include<stdio.h> /*
  • 湖大C语言程序设计7

    2017-04-26 23:23:22
    C语言编程:一个数的各位数字倒过来...如果一个数等于它的反序数,则称它为对称数或回文数1993以内的二进制对称数 #include void main() { int i,j,k,n,a[11]={0}; for(i=1;i;i++){ n=i; k=0; while(n>0){

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

c语言求回文数

c语言 订阅