C语言编程:一个数的各位数字倒过来所得到的新数叫原数的反序数.

一个数的各位数字倒过来所得到的新数叫原数的反序数.如果一个数等于它的反序数,则称它为对称数或回文数。求10000以内的二进制对称数
算法说明:先将正整数n的二进制字符形式放在字符数组1中,二进制字符形式的反序放在字符数组2中,然后,比较这两个字符串,若相等,则是二进制对称数

#include<string.h>
#include <stdio.h>
int comp(int i,char *a); /*判断是否是回文数的函数*/
int main(void)
{ int i,j=1;
char a[12];
for(i=0;i<10000;i++)
{ if(comp(i,a))
{ printf("%-4d:%-11s ",i,a);j++; } /*显示结果时,":"前面是10进制数,后面是对应的2进制数*/
if(!(j%5)) { j=1;printf("\n"); }; /*每五个数一行,使得显示更整齐*/
}
getch();
}
int comp(int i,char *a)
{ char b[12];
int j,k;
if(i==0) /*如果待判断的数为0,则返回1(0是回文数)*/
{ a[0]='0';a[1]='\0';
return 1;
}
for(j=0;i!=0;i/=2) b[j++]='0'+i%2;
/*将i依次除以2,每次得到的余数存入数组b中(这样得到的是逆序的2进制数)*/
b[j--]='\0'; /*字符串最后一位置为'\0'*/
for(k=0;j>=0;k++,j--) a[k]=b[j]; /*倒转b并存入a,得到正序的2进制数*/
a[k]='\0';
return !(strcmp(a,b)); /*返回两数组的比较结果*/
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-02
#include<stdio.h>
#include<string.h>

void change(long int n,char *a) //将十进制转换成二进制给数组a
{
long int i=0;
while(n)
{
a[i]=n%2+48;
n=n/2;
i++;
}
a[i]=0;
}

void copy(char *a,char *b) //倒置数组a给b
{
int n,i=0,j;
n=strlen(a);
while(n)
{
b[i++]=a[--n];
}
b[i]='\0';
}

void main()
{
long int n;
char a[20],b[20];
for(n=1;n<=10000;n++)
{
change(n,a);
copy(a,b);
if(!strcmp(a,b)) //比较数组a,b
printf("%ld\n",n);
}
}本回答被提问者采纳
第2个回答  2019-02-02
#include<stdio.h>
#include<string.h>
void
change(long
int
n,char
*a)
//将十进制转换成二进制给数组a
{
long
int
i=0;
while(n)
{
a[i]=n%2+48;
n=n/2;
i++;
}
a[i]=0;
}
void
copy(char
*a,char
*b)
//倒置数组a给b
{
int
n,i=0,j;
n=strlen(a);
while(n)
{
b[i++]=a[--n];
}
b[i]='\0';
}
void
main()
{
long
int
n;
char
a[20],b[20];
for(n=1;n<=10000;n++)
{
change(n,a);
copy(a,b);
if(!strcmp(a,b))
//比较数组a,b
printf("%ld\n",n);
}
}
第3个回答  2009-05-02
问题分析与算法设计
可设整数N的千、百、十、个位为i、j、k、l,其取值均为0~9,则满足关系式:
(i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i)
的i、j、k、l即构成N。

*程序说明与注释
#include<stdio.h>
int main()
{
int i;
for(i=1002;i<1111;i++) /*穷举四位数可能的值*/
if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)
/*判断反序数是否是原整数的9倍*/
printf("The number satisfied stats condition is: %d\n",i);
/*若是则输出*/
}
相似回答