3

我做了一个程序,它划分两个变量假设 a 和 b,从文本文件中读取,但这在循环中因为我想划分这些变量,直到商为 1,这仅适用于可整除的数字,如果不可分割,它将指示/打印“无效”。到目前为止,这一切我已经被卡住了。希望有人能给我建议如何做到这一点。

在我的文本文件 mytxt.txt 中。每行两个数字之间有一个空格。

27 3
40 4
1000 5
625 5

继承人我到目前为止在我的代码中得到了什么

  #include <iostream>
  #include <fstream>
  int main() {

   std::ifstream file("mytxt.txt");
    if ( file.eof()) return 0;
     int a, b, cnt=0;

      while (!file.eof()) {
            file>>a>>b;
          loop: 
                 std::cout<<a << " ";
                 a/=b;
          if(a%b == cnt) 
                 goto loop;
                 std::cout<<"\n";
                    }
          file.close();
          system("pause");
}

这个的输出是

27 9 3
40
1000 200 40
625 125 25 5
Press any key to continue . . . 

但应该是这样的

27 9 3 1
Invalid
Invalid
625 125 25 5 1

最后一个应该有 3/3 有 1。我应该在我的代码中包含什么来执行此操作并插入一个条件,如果它不可整除,它会打印“无效”。提前致谢。请原谅我的语法。

4

5 回答 5

0

根据您的描述:

将这些变量除以 ' 直到商为 1

这意味着循环直到a == 1,而不是 while a%b == 0

如果不可分割,它将指示/打印“无效”

所以检查可分性

if (a%b != 0) {
    // it's invalid
}

我建议使用像forand之类的循环结构while,而不是用 手工制作自己的意大利面条goto,并且还缩进代码以匹配其结构,以使代码更易于人类理解。

于 2013-09-17T10:26:31.630 回答
0

我认为这段代码会做你想做的(查看下面的注释了解详细信息):

#include <iostream>
#include <fstream>
#include <math.h>

int main() {
    std::ifstream file("mytxt.txt");
    if (file.eof())
        return 0;

    int a, b;
    double tmp;

    while ((file >> a >> b)) {
        if( a == 0 || b == 0 )
            continue;                    

        tmp = log(a) / log(b);
        if (tmp != floor(tmp))
            std::cout << "Invalid";
        else {
            do {
                std::cout << a << " ";
            }while((a/=b) != 1);
            std::cout << "1";
        }
        std::cout << "\n";
    }
    file.close();
    system("pause");
}

首先:如果您想使用除法循环检查是否无效,那么您必须保存所有值,然后检查是否1全部打印,否则打印无效。

第二:“ First ”被认为是一种不好的方法,您可以改用log函数,检查底数的对数是否ab您一个非代数整数,然后打印 Invalid。否则转到您的除法循环并打印您的数字序列,请注意打印1是可以省略的已知信息。

第三:值得添加对读数的检查,例如,如果您的文件在其末尾有一个新行,您将不会退出循环。因此,建议您对读取流进行 IO 检查if(!(file >> a >> b));你甚至可以把它作为主循环检查。此外,值得在 a 和 b 上添加逻辑检查以避免特殊值,例如0.

第四:通常,goto除了少数情况外,使用语句被认为是有害的。因此,最好尽可能避免它。这里有一些不错的文章和讨论:

于 2013-09-17T11:20:34.530 回答
0

a您在分割之前正在打印......并且您无法识别它何时“无效”。如果您只想打印“无效”,我认为您需要将获得的值存储为除数,然后仅在值变为 1 时打印它们。

并且您应该使用while(file>>a>>b)而不是while(!file.eof()),因为如果您使用后者,您将多次运行循环。

于 2013-09-17T10:16:11.100 回答
0

问题是您将 a 相除,然后检查它是否仍可整除……因此,例如,您打印“3”,然后打印 a := 3/3=1 (不能被 3 整除),现在您的循环结束而没有打印“1”...

但是,我建议您使用另一个“while”循环而不是“goto”。

于 2013-09-17T10:17:33.230 回答
0
#include <iostream>
#include <fstream>

int main()
{
    std::ifstream file("Input.txt");
    if (file.eof()) return 0;
    int a, b, c, cnt=0;
    while (!file.eof())
    {
        file>>a>>b;
        c = a;
        while(a > 1)
        {
            if (a % b) break;
            a /= b;
        }
        if (a == 1)
        {
            while(c >= 1)
            {
                std::cout << c << " ";
                c /= b;
            }
        }
        else
        {
            std::cout << "Invalid";
        }
        std::cout << std::endl;
    }
    file.close();
}

我们使用第一个while循环来查找是否有可能达到 1。如果不可能,我们打印Invalid或迭代直到我们得到 1 并打印所有中间结果。

输出

27 9 3 1 
Invalid
Invalid
625 125 25 5 1 
于 2013-09-17T10:32:36.687 回答