我要解决的问题是:
为解决此问题,我编写了以下代码:
#include<iostream>
#include<cmath>
using namespace std;
int computervirus(int n){ //n:Tage
int nr_virus= 100;
int nr_fixed;
int rest = 0;
if(n == 0) return 100;
if(n <= 20){
nr_virus += computervirus(n-1)*0.7;
nr_fixed = pow(2,n);
rest = nr_virus - nr_fixed;
}
return rest;
}
int main(){
cout << endl;
for(int i=0; i <= 20; i++){
cout << "at the "<< i << " .day are still "<< computervirus(i) << " infected Computers\n" <<endl;
}
return 0;
}
该号码(受感染的计算机)的输出不正确,因为感染速度明显更快,至少可以在前9天进行修复。 我不确定问题在哪里。你能帮忙吗?
答案 0 :(得分:0)
您忘记在for循环的主体周围使用花括号
int main(){
for(int i=0; i <= 20; i++)
{
cout << endl;
cout << "at the "<< i << " .day are still "<< computervirus(i) << " infected Computers\n" <<endl;
}
return 0;
}
在循环的第一个语句之前放置左括号{
,在最后一个语句之后放置右括号}
。
因为花括号仅丢失第一个语句cout << endl;
在循环内。
答案 1 :(得分:0)
您在第n天的递归尝试使用第n + 1天的结果的70%。这将导致无限递归。您必须使用第一天的70%,它才能正常工作。现在不是前一天的70%,而是70%,所以不是* 0,7
而是* 1,7
。
并且您需要考虑到感染的计算机数量不能为负数。
最后,您高估了维修量:在第1天的维修工作是第2天,在第2天的维修工作是4天,但是由于第1天的递归中已经计入了第1天的第2天,因此您推论了两次。因此,您应该只计算第n天固定的其他计算机。所以pow(2,n-1)。
更正后的代码如下:
int computervirus(int n){ //n:Tage
int nr_virus= 100;
int nr_fixed = 0;
int rest = 0;
if(n>0){
nr_virus = computervirus(n-1)*1.7; // n-1 not n+1
if (n==1)
nr_fixed = 2;
else nr_fixed = pow(2,n-1);
}
rest = nr_virus - nr_fixed;
if (rest<0)
rest = 0;
return rest;
}