【问题标题】:How to create a program that be able to get the two numbers with a maximum of 1000 digits from the user and then print the result?如何创建一个程序,能够从用户那里获取最多 1000 位的两个数字,然后打印结果?
【发布时间】:2015-03-05 12:23:50
【问题描述】:

我正在尝试创建一个程序,该程序能够从用户那里获取最多 1000 位的两个数字,然后打印结果(使用 C(编程语言))

创建此程序的注意事项:

1-获取两个数字,使用长度为 1000 个字符的字符串。(考虑一个字符作为字符串末尾的零)

2-存储数字,使用两个长度为1000的数组块(家)。大数字的每个数字必须存储在单独的数组块中。(例如:365(“3”存储在一个块(家)和 6 存储在另一个块和...)

3-要获取字符串形式的数字并将其转换为数字数组、加法、减法和打印大数字,请使用单独的函数。 “main”函数必须非常小。


我写了这段代码,但不知道为什么它不起作用:

/*codes*/


#include <conio.h>
#include <stdio.h>
#define hang 1

void sinascan1(char sina[2],int i){
     puts("Enter number 1");
     gets(sina);
    while (i != hang){
          sina[i] -= 48;
          printf ("%d\n", sina[i]);
          i++;
          }
     }
void sinascan2(char sina1[2],int i){
     puts("Enter number 2");
     gets(sina1);
    while (i != hang){
          sina1[i] -= 48;
          printf ("%d\n", sina1[i]);
          i++;
          }
     }
void sinajam(char sina[2],char sina1[2],char jam[3],int i){
     puts("____");
     int f,g;
     while (i != hang){ 
           jam[i]=sina[i]+sina1[i];
           printf ("%d\n", jam[i]);
           i++;
           }
     }
int main()
{   int i=0;
    char sina[2],sina1[2];
    char jam[2];
    sinascan1(sina,i);
    sinascan2(sina1,i);
    sinajam(sina,sina1,jam,i);
    getch();
    return 0;
}

我该怎么做?

【问题讨论】:

  • 使用调试器检查您的代码。如果你在 linux 上,gdb 是一个不错的选择。如果windows下Visual Studio有很好的编译器/调试器组合。
  • 编译器是 dev c++ ;
  • 1) 代码中没有任何内容建议将输入限制为 1000 位。 2)gets() 肯定是个问题。使用fgets()
  • “它不起作用”非常不精确。你用什么输入来测试它,结果是什么?

标签: c arrays string max digits


【解决方案1】:

我认为考虑一个字符作为字符串末尾的零

char str[1000]; //number of digits
int i=0;

while(true){
    scanf("%c", (str+i));
    if( *(str+i) == '0') break;
}

我不是很确定,但我认为它至少给出了一点

【讨论】:

  • 零是'\0',char str[1000+1];scanf("%1000s", str);
【解决方案2】:

首先,很难在大小为 2 的数组中存储 1000 个字符! C 语言对程序员非常有信心,并且从不控制数组的容量……只是它会导致未定义的行为,因为您尝试在不存在或无法用于其他任何内容的内存中写入。

接下来在你的手册中写下gets 函数上方闪烁的红色:永远不要使用它!。它本质上是不安全的,因为您在数组(已定义大小)中写入字符串,而没有任何方式知道输入的大小!始终使用fgets,而不是可以将输入字符串限制为缓冲区的大小。

最后,但它远没有其他 2 个严重,除非您有特殊要求,否则请避免使用 conio.h,因为它不能跨不同架构移植。

所有这些都是您的程序可能中断导致意外结果或不可移植的原因,但这还不是全部:当我比今天年轻得多的时候,我知道要添加 2 个数字,您需要添加它们的数字,但是当2位数字的总和大于9(比如6 + 7 = 13),你只保留低位数字(这里是3)和进位(1)到下一列。然后你从低位开始添加数字......

你目前拥有的只能加1位数字!

所以这是一个可能的实现:

#include <stdio.h>
#include <memory.h>
#include <string.h>
#define SIZE 1000

void sinascan(char* sina, int size, int i){ 
    char *c = sina;
    int l;
    int temp;

    ::memset(sina, 0, size); /* initialize buffer to 0 */
    printf("Enter number %d : ", i);
    fgets(sina, size , stdin);
    while ((*c >= '0') && (*c <= '9')) { /* only get digits */
          c++;
          }
    *c = 0; /* remove optional spaces and end of line */
    /* now reverse digits so that sina[0] is low order digit */
    l = strlen(sina);
    for (i=0; i<l/2 + 1; i++) {
        temp = sina[i];
        sina[i] = sina[l - 1 - i];
        sina[l - 1 - i] = temp;
    }
    for (i=0; i<l; i++) {
        sina[i] -= '0';
    }
     }


int sinajam(char *sina,char *sina1,char *jam, int size){
     puts("____");
     int i,sum, carry = 0;
     for (i=0; i<size; i++ ) {
           sum = sina[i] +sina1[i] + carry;
           jam[i] = sum % 10;
           carry = sum / 10;
           printf ("%d", jam[i]);
           }
     return carry;
     }
int main()
{   int i=0;
    char sina[SIZE+1],sina1[SIZE+1]; /* add one place for terminating null */
    char jam[SIZE];
    sinascan(sina,SIZE+1, 1);
    sinascan(sina1, SIZE+1, 2);
    i = sinajam(sina,sina1,jam,SIZE);
    if (i != 0) {
        puts("overflow");
    }
    return 0;
}

此实现接受最多 1000 位的输入,生成最多 1000 位的总和并发出溢出信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多