回 帖 发 新 帖 刷新版面

主题:[讨论]各位高手,看看我这新手的C程序错在哪,怎么改?

/* 输入一个长整数,从高位开始逐位输出,如输入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个回复)

沙发

scanf("%ld",&a);
-----------------
不看算法

板凳

好低效。。。。
如果是C的话可以用itoa然后逐项输出;
如果是C++的话还可以用反向迭代器;
如果是C++Builder的话可以直接赋值给String类型的变量然后想咋输出咋输出。

3 楼

长整数,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, &ltmp)) != 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 楼


呃... 我是新手,只是在练习中,您的程序太深奥了,我有点看不懂额...  但是非常谢谢你能给我建议!!

5 楼

#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 楼

看你的程序挺繁琐的,求一个整数的各位数字有很简单的算法:
//n为你要分解的数字
while(n)
{
    a[i]=n%10;//存储分解出来的某位数字
    n=n/10;
i++;
}

7 楼

我已经给你改好了,编译成功,运行结果也正确了,代码如下:
#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 楼


 虽然有点看不懂你的程序,但是谢谢你的帮助..!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册