我制作了一个程序,它将两个变量分开,假设一个& 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。我应该在我的代码中执行此操作并插入一个条件,如果它不可分,则打印“无效”。提前致谢。请原谅我的语法。
答案 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
}
我建议使用像for
和while
这样的循环结构,而不是用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
语句被认为是有害的,除非在极少数情况下。所以,最好尽可能避免它。以下是关于它的好文章和讨论: