主题:[讨论]各位高手,看看我这新手的C程序错在哪,怎么改?
yuyong87394634
[专家分:0] 发布于 2011-05-25 21:19:00
/* 输入一个长整数,从高位开始逐位输出,如输入123456,输出:1,2,3,4,5,6 */
#include "stdio.h"
#include "math.h"
void main()
{
int a,i,b,digit=0;
printf("输入一长整数:");
scanf("%ld",&a);
i=a;
while(i)
{
i=i/10;
digit++;
}
while(a){
b=a/(pow(10,digit));
printf("%d",b);
a=a-((a/(pow(10,digit)))*(pow(10,digit)));
digit--;
}
}
回复列表 (共8个回复)
沙发
fragileeye [专家分:1990] 发布于 2011-05-25 22:16:00
scanf("%ld",&a);
-----------------
不看算法
板凳
cgl_lgs [专家分:21040] 发布于 2011-05-25 22:55:00
好低效。。。。
如果是C的话可以用itoa然后逐项输出;
如果是C++的话还可以用反向迭代器;
如果是C++Builder的话可以直接赋值给String类型的变量然后想咋输出咋输出。
3 楼
cxxcomp [专家分:2370] 发布于 2011-05-26 02:46:00
长整数,int可能不太合适。 另外,觉得这个问题没太大意思,即不属于大数运算范畴,也没实际的价值。作为练习,还可以。 代码如下:把一个unsigned long int 类型数值,分解放置一个array中,以备后用。另外,程序有个bug, 会把0剔除。建议讨论。LS的建议确实可以,既然输入,没必要非采用int类型的,接收一个string就可以,像多大就多大。然后对这个string做处理。分解,四则等等。觉得更好。不过既然是用C,那就用C写吧。
#include <math.h>
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_SIZE 12
typedef unsigned long int UINT;
int Get_Digit(const UINT number); //0~4294967295
int Get_Rem(const UINT number, UINT uu, int* pa)
{
static int index;
div_t res;
res.quot = pa[index++] = number / uu;
res.rem = number % uu;
return res.rem;
}
int* DeCompose(const UINT number)
{
static int na[MAX_SIZE];
if (number > ULONG_MAX)
{
fputs("Input number over range.(0~4294967295)\n", stderr);
exit(EXIT_FAILURE);
}
int digit = Get_Digit(number);
switch (digit)
{
case 10:
DeCompose(Get_Rem(number, 1000000000, na));
break;
case 9:
DeCompose(Get_Rem(number, 100000000, na));
break;
case 8:
DeCompose(Get_Rem(number, 10000000, na));
break;
case 7:
DeCompose(Get_Rem(number, 1000000, na));
break;
case 6:
DeCompose(Get_Rem(number, 100000, na));
break;
case 5:
DeCompose(Get_Rem(number, 10000, na));
break;
case 4:
DeCompose(Get_Rem(number, 1000, na));
break;
case 3:
DeCompose(Get_Rem(number, 100, na));
break;
case 2:
DeCompose(Get_Rem(number, 10, na));
break;
case 1:
if (number) DeCompose(Get_Rem(number, 1, na));
}
return na;
}
int Get_Digit(const UINT number) //0~4294967295
{
return int(log10(number))+1;
}
int main(int, char **, char **)
{
unsigned long int lnum, ltmp;
char buffer[MAX_SIZE];
while((fgets(buffer, MAX_SIZE, stdin)) != NULL)
{
if ((sscanf(buffer, "%lu %lu", &lnum, <mp)) != 1)
{
fprintf(stderr, "Bad input skipped: %s", buffer);
continue;
}
int* pa = DeCompose(lnum);
for (int ix = 0; ix < 9; ++ix)
{
printf("%3d,", pa[ix]);
}
puts("\n");
}
}
4 楼
yuyong87394634 [专家分:0] 发布于 2011-05-26 17:32:00
呃... 我是新手,只是在练习中,您的程序太深奥了,我有点看不懂额... 但是非常谢谢你能给我建议!!
5 楼
windy0will [专家分:2300] 发布于 2011-05-26 19:30:00
#include <stdio.h>
int show (long int sl)
{
int i, digits;
char sign, buf[32];
i = 32;
buf[ --i ] = '\0';
sign = (sl < 0) ? (sl = -sl, '-') : (0); // 负数?
do
buf[ --i ] = (long int)'0' + (sl % 10);
while ((sl /= 10));
digits = 31 - i;
if (sign)
putchar (sign);
printf (buf + i);
return digits;
}
int main (void)
{
long int sl = 0, digits;
printf ("请输入一长整数: ");
scanf ("%ld", &sl);
digits = show (sl);
printf("是");show(digits);printf("位数"); // sl是几位数
return (0);
}
6 楼
qimishan [专家分:30] 发布于 2011-05-26 21:54:00
看你的程序挺繁琐的,求一个整数的各位数字有很简单的算法:
//n为你要分解的数字
while(n)
{
a[i]=n%10;//存储分解出来的某位数字
n=n/10;
i++;
}
7 楼
Grand_Unified [专家分:90] 发布于 2011-05-26 22:57:00
我已经给你改好了,编译成功,运行结果也正确了,代码如下:
#include <stdio.h>
void main()
{
long a;
int array[100];
int count=0;
printf("请输入一个长整数:\n");
scanf("%ld",&a);
while (a)
{
array[count]=a%10;
a/=10;
count++;
}
for (int i=count-1;i>=0;i--)
printf("%d\t",array[i]);
printf("\n");
}
8 楼
yuyong87394634 [专家分:0] 发布于 2011-05-27 17:46:00
虽然有点看不懂你的程序,但是谢谢你的帮助..!!
我来回复