Sum 2 Big Integers使用getchar而不是scanf-C编程存储在数组中

时间:2014-03-19 01:13:36

标签: c arrays getchar

我需要这个程序的帮助,下面是我到目前为止写的对象和程序:

目标:编写一个允许用户使用100位正整数的C程序,然后打印出两个数字的总和。

到目前为止我使用 scanf 编写的程序:

#include <stdio.h>
int main(void) {

int sum=0,i,j,array[100];



for(i=1;i<3;i++)
{
printf("operand #%d :",i);
scanf("%d",&array[i]);
printf("value entered: %d\n", array[i]);
}



for(j=1;j<i;j++)
{
sum=sum+array[j];
}



printf("The sum of array is %d ", sum);

return 0;
}

以下是我使用的代码 getchar()

#include <stdio.h>
int main(void) {

int c,i,j,sum=0;

char a[100];

for(i=1;i<3;i++)
{
printf("operand #%d :",i);


do{
    if(i < 100){
        a[i] = (char)c;
        i++;
        }
    else{
      printf("Error: Number must be greater than 0,try again");
    }
} while((c = getchar()) != '\n');


printf("value entered: %d\n", a[i]);
}



for(j=1;j<i;j++)
{
sum=sum+a[j];
}



printf("The sum of array is %d ", sum);

return 0;
}

任何帮助都是合适的!

1 个答案:

答案 0 :(得分:1)

您的一个问题是,您正在同时使用i两个不同的工作。它不会起作用。

for(i=1;i<3;i++)  // Use #1
{
    printf("operand #%d :",i);

    do{
        if(i < 100){
            a[i] = (char)c;  // Use #2
            i++;
            }
        else{
          printf("Error: Number must be greater than 0,try again");
        }
    } while((c = getchar()) != '\n');

    printf("value entered: %d\n", a[i]);
}

外部循环可能只执行一次 - 如果第一个数字是一位数字,它将执行两次。

此代码在您调用c之前也会分配getchar(),这也不会改善事情。您可能还需要将ASCII数字转换为一位数字(从数字中减去'0',但您应该先检查它是否为数字,并且应该在非数字上打破内部循环)。

如果您要存储3个最多100位数的数字,则需要最多300位数的存储空间。 char a[100]不够大。

您可以使用以下内容:

char a[3][100];
int  n[3];
for (int i = 0; i < 3; i++)
{
    int c;
    int j;
    printf("Operand #%d: ", i);
    for (j = 0; j < 100 && (c = getchar()) != EOF && isdigit(c); j++)
        a[i][j] = c - '0';
    n[i] = j;
    while (c != EOF && c != '\n')
        c = getchar();
}

如果您输入的数字为80,60和20位数,则会将{80}位数存储在a[0][0..79]中并将80放入n[0](因此您知道该数字的长度) ;它将60位数存储在a[1][0..59]中,并将60放入n[1];并将{20}位存储在a[2][0..19]中,并将20放入n[2]

在进行添加时,需要注意正确对齐数字,并确保在添加101位数时不会溢出应答缓冲区。有三个正十进制数,每个最多100位数,答案长度不能超过101位。


  

但是,您的代码无效。

True:以前的版本使用for (int j = 0; …),然后尝试在循环外访问j。修复显然是在循环之前声明j

但是,否则,代码确实有效。我已经调整了3到2的出现次数,因为你说你只需要两个数字。我拒绝从1开始索引;这是C,数组从C中的0开始索引。如果你想要一个基于1的语言,那就去使用Pascal或其他东西。

演示示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
    char a[2][100];
    int n[2];
    for (int i = 0; i < 2; i++)
    {
        int c;
        int j;
        printf("Operand #%d: ", i);
        for (j = 0; j < 100 && (c = getchar()) != EOF && isdigit(c); j++)
            a[i][j] = c - '0';
        n[i] = j;
        while (c != EOF && c != '\n')
            c = getchar();
    }
    for (int i = 0; i < 2; i++)
    {
        printf("%d: %2d digits: ", i, n[i]);
        for (int j = 0; j < n[i]; j++)
            putchar(a[i][j] + '0');
        putchar('\n');
    }
    return 0;
}

示例数据:

124232345289086098234232398098403242380980256454798796324635
98068704234280980243242349080928402342398408920482080980482034278795847396

示例输出:

Operand #0: 124232345289086098234232398098403242380980256454798796324635
Operand #1: 98068704234280980243242349080928402342398408920482080980482034278795847396
0: 60 digits: 124232345289086098234232398098403242380980256454798796324635
1: 74 digits: 98068704234280980243242349080928402342398408920482080980482034278795847396

这就是它的工作方式。你可能想要以不同的方式做;这是你的特权。有它!我不打算为你解决问题的另外一部分 - 我已经指出了最明显的问题(主要是,将a[0][1]添加到a[1][1]会对给定的输入产生无意义。)< / p>


这只使用微小的功能。其中有一些棘手的代码;要小心处理它,因为你可能会被要求详细解释它的作用,你需要理解这一切是安全的。

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

static inline int max(int x, int y) { return (x > y) ? x : y; }

/* Return dth digit from RH end of string of n digits in x */
static inline int digit(char *x, int n, int d)
{
    return (d < n) ? x[n - 1 - d] : 0;
}

int main(void)
{
    char a[2][100];
    int n[2];

    /* Input - can probably be tightened up */
    for (int i = 0; i < 2; i++)
    {
        int c;
        int j;
        printf("Operand #%d: ", i);
        for (j = 0; j < 100 && (c = getchar()) != EOF && isdigit(c); j++)
            a[i][j] = c - '0';
        n[i] = j;
        if (j == 0)
        {
            printf("No number - exiting\n");
            exit(0);
        }
        if (c != EOF && c != '\n')
        {
            if (j < 100 && !isdigit(c) && !isblank(c))
            {
                printf("Bogus data in input (%c)\n", c);
                exit(1);
            }
            while ((c = getchar()) != EOF && c != '\n')
            {
                if (!isblank(c))
                {
                    printf("Bogus data in input (%c)\n", c);
                    exit(1);
                }
            }
        }
    }

    /* Print for validation */
    int n_max = max(n[0], n[1]);
    for (int i = 0; i < 2; i++)
    {
        printf("V-%d: %2d digits: ", i, n[i]);
        int n_blanks = n_max - n[i] + 1;
        for (int j = 0; j < n_blanks; j++)
            putchar(' ');
        for (int j = 0; j < n[i]; j++)
            putchar(a[i][j] + '0');
        putchar('\n');
    }

    /* Addition */
    char sum[101];
    int carry = 0;
    int max_digits = max(n[0], n[1]);
    for (int i = 0; i < max_digits; i++)
    {
        int d0 = digit(a[0], n[0], i);
        int d1 = digit(a[1], n[1], i);
        int r = d0 + d1 + carry;
        if (r > 9)
        {
            carry = 1;
            r -= 10;
        }
        else
            carry = 0;
        sum[max_digits - i] = r;
    }
    if (carry)
        sum[0] = 1;
    else
        sum[0] = 0;

    /* Print result */
    printf("Sum: %2d digits: ", (sum[0] == 0) ? max_digits : max_digits + 1);
    if (sum[0] == 0)
        putchar(' ');
    for (int j = ((sum[0] == 0) ? 1 : 0); j <= max_digits; j++)
        putchar(sum[j] + '0');
    putchar('\n');

    return 0;
}

样品运行:

Operand #0: 888
Operand #1: 888
V-0:  3 digits:  888
V-1:  3 digits:  888
Sum:  4 digits: 1776


Operand #0: 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
Operand #1: 9876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210
V-0: 100 digits:  1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
V-1: 100 digits:  9876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210
Sum: 101 digits: 11111111101111111110111111111011111111101111111110111111111011111111101111111110111111111011111111100

Operand #0: 9876543210a
Bogus data in input (a)


Operand #0: 9876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210a
Bogus data in input (a)

Operand #0: 98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109
Bogus data in input (9)

Operand #0: 
No number - exiting

这不完美:

Operand #0: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Operand #1: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
V-0: 100 digits:  0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
V-1: 100 digits:  0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Sum: 100 digits:  0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

从输入(和输出)中去掉前导零作为练习留给你。