如何划分两个变量,直到在c ++中的循环内得到1的商

时间:2013-09-17 10:03:54

标签: c++

我制作了一个程序,它将两个变量分开,假设一个& 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。我应该在我的代码中执行此操作并插入一个条件,如果它不可分,则打印“无效”。提前致谢。请原谅我的语法。

5 个答案:

答案 0 :(得分:0)

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

你应该使用while(file>>a>>b)代替while(!file.eof()),因为如果你使用后者,你将运行一次以上的循环。

答案 1 :(得分:0)

问题是你划分了一个然后你检查它是否仍然是可分的...例如,你打印“3”,然后a:= 3/3 = 1(不能被3整除)现在你的循环完成而没有打印“1”......

但是,我建议你使用另一个'while'循环代替'goto'。

答案 2 :(得分:0)

根据您的描述:

  

将这些变量分开,直到它得到1

的商

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

  

如果不可分,则表示/打印“无效”

所以用

检查可分性
if (a%b != 0) {
    // it's invalid
}

我建议使用像forwhile这样的循环结构,而不是用goto手工制作自己的意大利面,并且还要使代码缩进以匹配其结构,以使代码更容易让人跟随。

答案 3 :(得分: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并打印所有中间结果。< / p>

<强>输出

27 9 3 1 
Invalid
Invalid
625 125 25 5 1 

答案 4 :(得分: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打印所有值,否则打印无效

第二次:'第一次'被认为是一种糟糕的方法,您可以使用log函数,检查a的对数是否为到基数b给你一个非代数整数然后打印无效。否则,请转到您的分区循环并打印您的数字序列,请注意打印1是一个已知的信息,可以省略。

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

第四:一般情况下,使用goto语句被认为是有害的,除非在极少数情况下。所以,最好尽可能避免它。以下是关于它的好文章和讨论: