对于给定的n,我试图找到可被n整除的最小数字,并且还将数字之和作为n。
例如:对于n = 10,输出应为190,对于n = 11,输出应为209
我采用了广度优先遍历方法来解决我的问题。
#include <iostream>
#include <queue>
#include <string>
using namespace std;
class State{
public:
int sum,rem;
string str;
State(int s,int r,string st){
sum = s;
rem = r;
str = st;
}
};
int main() {
int n,newSum,newRem;
queue<State> q;
cin>>n;
bool visited[n+1][n+1] = {0};
State curr = State(0,0,"");
q.push(curr);
visited[0][0] = 1;
while(!q.empty()){
curr = q.front();
q.pop();
if(curr.sum==n && curr.rem==0){
cout<<curr.str<<endl;
break;
}
for(int j=0; j<=9; j++){
newSum = curr.sum + j;
newRem = (curr.rem*10+j)%n;
if(newSum > n){
break;
}
else if(!visited[newSum][newRem]){
curr = State(curr.sum+j, ((curr.rem*10)+j)%n,curr.str+to_string(j));
q.push(curr);
visited[newSum][newRem] = 1;
}
}
}
return 0;
}
我的代码返回一个满足条件的数字,但它不是最小的数字。 对于n = 10,我的代码给出了12340 对于n = 11,我的代码给出1010207
Ideone链接:http://ideone.com/c4W48N
答案 0 :(得分:0)
您应该尝试使用调试器,它会很快显示问题。
在这一行:
curr = State(curr.sum+j, ((curr.rem*10)+j)%n,curr.str+to_string(j));
q.push(curr);
您正在为curr
变量分配一个新值,然后在循环中使用该变量。这意味着不是尝试1,2,3等,而是尝试1,12,123等。
您还在重新计算刚刚计算过的项目。
您可以将其替换为
State newState = State(newSum, newRem, curr.str + to_string(j));
q.push(newState);
或更简单地说:
q.push(State(newSum, newRem, curr.str+to_string(j)));