C的新手。试图编写打印出回文数字的程序<百万。 打印出胡言乱语。我用字符串犯了错误吗?
int decimal_pali(int x)
{
int digits=0;
int num=x;
char D[7];
while(num>0)
{
D[digits]=num%10;
digits+=1;
num/=10;
}
D[digits]='\0';
num=atoi(D);
if(num == x)
{
return 1;
}
return 0;
}
答案 0 :(得分:4)
你的错误在于:
D[digits]=num%10;
应该是
D[digits] = num%10 + '0';
num % 10
将导致0到9之间的数字,但由于您正在使用字符,因此需要获取数字的ASCII值。如果您查看ASCII table,您会发现为了达到您想要的效果,您需要将'0'
(48)的ASCII值添加到该值以获得正确的字符
答案 1 :(得分:0)
好奇心不会让我抵抗“不止一个基地”的事情,尽管我怀疑这个结果有任何(非平凡的)数论理论意义。无论如何,这是代码,并在下面运行一个示例...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( int argc, char *argv[] ) {
int n1 = ( argc>1? atoi(argv[1]) : 1 ),
n2 = ( argc>2? atoi(argv[2]) : 999 ),
b1 = ( argc>3? atoi(argv[3]) : 10 ),
b2 = ( argc>4? atoi(argv[4]) : 10 );
int n=n1, b=b1, ispal();
char *itoa();
for ( n=n1; n<=n2; n++ ) {
for ( b=b1; b<=b2; b++ ) if ( !ispal(n,b) ) goto next_n;
printf("%10d(base10)",n);
for ( b=b1; b<=b2; b++ ) printf(" = %s(%d)", itoa(n,b),b);
printf("\n");
next_n: ; }
} /* --- end-of-function main() --- */
int ispal ( int i, int base ) {
char *itoa(), *a=itoa(i,base);
int answer=0, k=0,n=strlen(a);
if ( n > 1 ) {
for ( k=0; k<n/2; k++ )
if ( a[k] != a[n-k-1] ) goto end_of_job;
answer = 1; }
end_of_job: return ( answer );
} /* --- end-of-function ispal() --- */
char *itoa ( int i, int base ) {
static char a[99], digits[99] = /* up to base 65 */
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$*";
int n = 0;
while ( 1 ) {
a[n++] = digits[i%base];
if ( (i/=base) < 1 ) break; }
a[n] = '\000';
return ( a );
} /* --- end-of-function itoa() --- */
我称它为palinum.c,典型的运行给出了......
bash-4.3$ ./palinum 1 9999999 3 4
10(base10) = 101(3) = 22(4)
130(base10) = 11211(3) = 2002(4)
11950(base10) = 121101121(3) = 2322232(4)
175850(base10) = 22221012222(3) = 222323222(4)
749470(base10) = 1102002002011(3) = 2312332132(4)
1181729(base10) = 2020001000202(3) = 10200200201(4)
在基础3和基础4中仅显示1到1百万之间的“回文”数字。我做的其他一些测试在三个连续碱基中没有同时显示回文。但该程序很容易改变为允许任何一组(非连续)基础。 (对于一个不那么简单的编程挑战,一次尝试多个n的多个线程。)