编写一个程序,确定正整数是否完美。您的计划确定
并显示1到10,000之间的所有完美数字。 编写一个从用户读取整数的程序。如果用户输入的值小于2
然后您的程序应显示相应的错误消息。否则你的程序应该
显示可以乘以一起计算n的素数,其中一个因子出现
每行。例如:
0-0, 1-0, 2-0, 2-1
0-0, 0-1, 1-1, 2-1
{
int m, n;
cout<<"Enter the finals scores of both teams";
cout<<"\nenter the score for team m :";
cin>>m;
cout<<"Enter the score for team n :";
cin>>n;
if (m < 0 && n < 0){
cout<<"score can't be negative";
cout<<"\nenter the score for team m :";
cin>>m;
cout<<"Enter the score for team n :";
cin>>n;
}
else{
int k=0;
if (n==0){
for (int j = 0; j <= m; j++){
for (k; k <= n; k+=1){
cout<<j<<"-"<<k<<",\t";
}
k--;
}
}
else if(m==1 && n==1){
int i=0;
int k=0;
for (int j = 0; j <= m; j++){
for (k; k <= n; k+=1){
cout<<j<<"-"<<k<<",\t";
}
k--;
}
cout<<endl<<endl;
for (int j = 0; j <= n; j++){
for (i; i <= m; i+=1){
cout<<i<<"-"<<j<<",\t";
}
i--;
}
}
else {
int i=0;
int k=0;
for (int j = 0; j <= m; j++){
for (k; k <= n; k+=1){
cout<<j<<"-"<<k<<",\t";
}
k--;
}
cout<<endl<<endl;
for (int j = 0; j <= n; j++){
for (i; i <= m; i++){
cout<<i<<"-"<<j<<",\t";
}
i--;
}
}
}
}
答案 0 :(得分:0)
使用递归的简单答案,如果你不知道递归首先阅读
void print_goals(int m,int n,int i,int j,string s)
{
if(i == m && j == n)
{
cout<<s+char(48+i)+'-'+char(48+j)<<endl;
return;
}
if(i<=m)
print_goals(m,n,i+1,j,s+char(48+i)+'-'+char(48+j)+',');
if(j<=n)
print_goals(m,n,i,j+1,s+char(48+i)+'-'+char(48+j)+',');
}
将其称为print_goals(5,2,0,0,"");
其中m = 5且n = 2
答案 1 :(得分:0)
除了Ambika的回答,让我向你暗示你的io处理问题:
首先,这是简单且无害的部分,在if-else子句中,if或else块被执行,但从不两者(除非使用一些脏的goto hacks ......)。
因此,在if块中再次询问用户'm'和'n'没有多大意义 - 所以要么不要这样做(只需离开cout << "score can't be negative";
,或删除else:
if(m < 0 || n < 0)
{
//...
}
print_goals(m, n, 0, 0, "");
// using Ambika's solution already...
但后来认为用户可能再次输入错误值::
while(m < 0 || n < 0)
// ^ instead of if!
现在更严重的问题(如果您使用上面建议的时间,它可能会真的严重):
想象一下,程序的用户输入 - 而不是有效数字 - 无效值,例如: G。通过意外点击一个字母键(s7
)。 cin >> n
无法读取int,并且将设置流的失败位。因此,随后从cin读取将立即失败而不修改m或n。尝试使用上面的建议并输入第一个-1
然后hello
- 并准备用ctrl-c打破程序!
解决方案:从开始就使用cin的getline()然后解析字符串,或者重置失败位,如下所示:
std::cin >> n;
if(std::cin.fail())
{
// reset the fail bit
std::cin.clear();
// important: discard the invalid input!
std::string s;
std::cin >> s;
// now we are prepared to read the input again
}
在循环中有这个,你很好。您可能希望将此循环打包到函数中,或者将其置于外部循环中以避免重复代码;这两个解决方案也解决了另一个关于可用性的小问题:你总是要求两个值,即使第一个值已经有效。我想出了双循环变体:
int result[2];
char c = 'm';
for(int& n : result)
{
for(;;)
{
std::cout << "enter the score for team " << c << ": ";
std::cin >> n;
if(std::cin.fail())
{
std::cout << "invalid input" << std::endl;
std::cin.clear();
std::string s;
std::cin >> s;
}
else if(n < 0)
{
std::cout << "score can't be negative" << std::endl;
}
else
{
break;
}
}
c = 'n';
}