我正在为我的Programming II课程尝试一个Hacker Rank问题。我可以让程序打印正确的值但顺序混乱,或者以正确的顺序打印错误的值
我尝试以不同的方式将循环嵌套在彼此内部,以更改顺序,或保留第一个输入变量值,以便第二个循环可以读取它。到目前为止,我还没有得到想要的结果。
int main()
{
int n;
for(int k = 0; k < 2; ++k)
{
cin >> n;
if(n == 1)
{
cout << "one\n";
}
else if(n == 2)
{
cout << "two\n";
}
else if(n == 3)
{
cout << "three\n";
}
else if(n == 4)
{
cout << "four\n";
}
else if(n == 5)
{
cout << "five\n";
}
else if(n == 6)
{
cout << "six\n";
}
else if(n == 7)
{
cout << "seven\n";
}
else if(n == 8)
{
cout << "eight\n";
}
else if (n >= 9)
{
cout << "nine\n";
}
}
for(int j = 0; j < 2; j++)
{
if(n % 2 == 0)
{
cout << "even\n";
}
else
{
cout << "odd\n";
}
}
return 0;
}
使用8和11校正结果
八分
九个
偶
奇怪的
我的结果
八分
九个
奇怪的
奇怪的
答案 0 :(得分:1)
您的代码的问题在于,接受8作为输入后,由于将其替换为11作为输入,因此未保存在任何位置。因此,在第一个for循环结束后,n仍为11,因此两次得到奇数。请改用数组。
#include<iostream>
int main()
{
int n;
int a[2],counter=0;
for(int k = 0; k < 2; ++k)
{
std::cin >> n;
a[counter++] = n;
if(n == 1)
{
std::cout << "one\n";
}
else if(n == 2)
{
std::cout << "two\n";
}
else if(n == 3)
{
std::cout << "three\n";
}
else if(n == 4)
{
std::cout << "four\n";
}
else if(n == 5)
{
std::cout << "five\n";
}
else if(n == 6)
{
std::cout << "six\n";
}
else if(n == 7)
{
std::cout << "seven\n";
}
else if(n == 8)
{
std::cout << "eight\n";
}
else if (n >= 9)
{
std::cout << "nine\n";
}
}
for(int k = 0;k<counter;k++){
if(a[k] % 2 == 0)
{
std::cout << "even\n";
}
else
{
std::cout << "odd\n";
}
}
return 0;
}
答案 1 :(得分:0)
此循环:
for(int j = 0; j < 2; j++)
{
if(n % 2 == 0)
{
cout << "even\n";
}
else
{
cout << "odd\n";
}
}
在您的第一个循环之外。
您根本就不需要循环,只需要if
即可获得偶数或奇数。
答案 2 :(得分:0)
在第二个循环中,您不会检查两个值,而只会检查最后一个(当您第二次覆盖第一个值时,使用n
分配给std::cin
时)。为了解决这个问题,您可以使用语法n
将int n[2];
声明为数组,然后在循环中循环编写n[k]
或n[j]
(在此特定程序中,请记住, n,j和k是任意名称)。在这种情况下,您实际上并不需要嵌套循环,但可以轻松实现嵌套循环,并且通常很有用。语法如下:
for(int i = 0; i < 23; i++)
{
/*bar*/
for(int j = 0; j < 42; j++)
{
/*foo*/
}
}
在这种情况下,bar
被执行23次,foo
被执行23 * 42次
当程序基于变量的值具有不同的行为,并且您只需要检查相等性但针对许多不同的值时,建议使用switch-case块而不是if和else if。
因此,如果我个人不得不编写您正在编写的程序,我会这样做:
#include <iostream>
int main()
{
using namespace std;
int n[2];
for(int k = 0; k < 2; ++k)
{
cin >> n[k];
switch(n[k])
{
case 1:
cout << "one\n";
break;
case 2:
cout << "two\n";
break;
case 3:
cout << "three\n";
break;
case 4:
cout << "four\n";
break;
case 5:
cout << "five\n";
break;
case 6:
cout << "six\n";
break;
case 7:
cout << "seven\n";
break;
case 8:
cout << "eight\n";
break;
default:
if(n[k]>=9)
cout << "nine\n";
break;
}
}
for(int j = 0; j < 2; j++)
if(n[j] % 2 == 0)
cout << "even\n";
else
cout << "odd\n";
return 0;
}
答案 3 :(得分:0)
您可以在一个循环中完成此操作:
static char const * const number_names[] =
{
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"
};
for (int k = 0; k < 2; ++k)
{
std::cin >> k;
if ((k >= 0) && (k < 10))
{
std::cout << number_names[k] << "\n";
}
else
{
std::cout << "number not within range\n";
}
if ((k%2) == 0)
{
std::cout << "even";
}
else
{
std::cout << "odd";
}
std::cout << "\n";
}
您可以将数字用作数字名称数组的索引。不需要switch
或if-else-if
梯子。通常,在线法官并不关心任务的执行方式。他们还有其他标准。
偶数/奇数测试包含在同一循环中。这样就无需记住数字(即将它们存储到数组中)。
偶数和奇数打印均使用“ \ n”,因此将其排除在外。 (对不起,但是是从前的习惯)。
该数组被声明为静态数组,因为它是私有数组并表示只有一个实例。
该数组包含不变的指针,例如常量。
该数组包含指向常量数据的指针。
选择了一个字符串文字数组,以便可以直接从程序的数据区域访问它,而无需通过诸如std::string
之类的中间数据结构。
答案 4 :(得分:-1)
您没有保存n的旧值,这就是为什么您的n不起作用。您可以使用将每个输入保存在数组n [2]中,或者下面的命令也可以工作。正如评论中提到的那样,由于打印顺序错误,因此我使用数组来使其工作。
int main()
{
int n[2];
for(int k = 0; k < 2; ++k)
{
cin >> n[k];
if(n == 1)
{
cout << "one\n";
}
else if(n == 2)
{
cout << "two\n";
}
else if(n == 3)
{
cout << "three\n";
}
else if(n == 4)
{
cout << "four\n";
}
else if(n == 5)
{
cout << "five\n";
}
else if(n == 6)
{
cout << "six\n";
}
else if(n == 7)
{
cout << "seven\n";
}
else if(n == 8)
{
cout << "eight\n";
}
else if (n >= 9)
{
cout << "nine\n";
}
}
for(int k = 0; k < 2; ++k)
{
if(n[k] % 2 == 0)
{
cout << "even\n";
}
else
{
cout << "odd\n";
}
}
return 0;
}