【基础训练-进制转换】Palindrom Numbers

问题链接 UVALive2389 ZOJ1078 Palindrom Numbers 。入门训练题,用C语言编写程序。
题意简述 :输入若干个整数,0作为结束。对于输入的整数n,问其几进制为回文数?
问题分析
这是一个有关进制处理的问题,都是套路。
程序中,封装了一个函数ispalindrom()用于将整数转换为指定进制的字符串,同时判断是否为回文数。使用数组ans[]作为标志,其元素个数需要多一个,是否为回文数的标志放在ans[0]中。

  1. #include <stdio.h>  
  2. #include <memory.h>  
  3.   
  4. #define MAXN1 20000  
  5. #define MAXN2 16  
  6.   
  7. char t[MAXN1];  
  8.   
  9. int ispalindrom(int val, int base)  
  10. {  
  11.     int count=0, start, end;  
  12.   
  13.     while(val) {  
  14.         t[count++] = val % base;     //val中有多少个base。(因为形式中每个数必须<进制数base,所以取余)
  15.         val /= base;                 //循环n次,则此行得到val中有多少个base的n次方。
  16.                                      //显然,这里得到的t数组表示的形式是反过来的。
  17.     }  
  18.   
  19.     start = 0;  
  20.     end = count - 1;  
  21.     count = 1;  
  22.     while(start < end) {  
  23.         if(t[start] != t[end]) {  
  24.             count = 0;  
  25.             break;  
  26.         }  
  27.   
  28.         start++;  
  29.         end--;  
  30.     }  
  31.   
  32.     return count;  
  33. }  
  34.   
  35. int main(void)  
  36. {  
  37.     int n, i;  
  38.     int ans[MAXN2+1];  
  39.   
  40.     while(scanf("%d", &n) != EOF && n != 0) {  
  41.         memset(ans, 0, sizeof(ans));  
  42.   
  43.         for(i=2; i<=MAXN2; i++)  
  44.             if(ispalindrom(n, i)) {  
  45.                 ans[0] = 1;  
  46.                 ans[i] = 1;  
  47.             }  
  48.   
  49.         if(ans[0]) {  
  50.             printf("Number %d is palindrom in basis", n);  
  51.             for(i=2; i<=MAXN2; i++)  
  52.                 if(ans[i])  
  53.                     printf(" %d", i);  
  54.             printf("\n");  
  55.         } else  
  56.             printf("Number %d is not palindrom\n", n);  
  57.     }  
  58.   
  59.     return 0;  
  60. }  

学到的点:
①十进制数怎么转换成不同进制的数(形式上)。
②判断回文(较简单)。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值