我需要制作一个用户输入一串数字的程序
然后输出分组的数字,以便每个分组(以空格分隔)大于将数字放在一起时的最后分组。
如果剩余的数字一起等于小于先前分组的总和,则省略它们
例:
314159265
会输出3 14 15 92
这里:3< 14< 15< 92但65被省略,因为它小于92
或
9876543210
会输出9 87 654 3210
这里:9< 87< 654< 3210
它必须使用1-20个字符长的字符串执行此操作5次。
我的代码适用于较短的字符串,即上面的字符串,但是当它们长于大约12个字符时,结束输出会混乱。
例:
98765432101234567898
输出9 87 654 3211 12333
代替9 81 654 3210 12345 67898
这里:9< 87< 654< 3211<它应该输出9< 12333。 87< 654< 3210< 12345< 67898
我不知道为什么它不能使用更大的字符串,任何帮助都会受到高度赞赏。
#include<iostream>
#include<iomanip>
#include<math.h>
#include<string>
#include<stdlib.h>
using namespace std;
void input (string &a,string num[20]){
string numfinal,temp;
cout<<"Enter the string of numbers: ";
getline(cin, a);
int length=a.length();
for(int i=0;i<length;i++){
num[i]=a.substr(i,1);
}
for(int r=0;r<length;r++){
int n=atoi(temp.c_str());
int o=atoi(num[r].c_str());
int p=temp.length();
if((length-r<=p)&&(o<n)){
}
else if((o>n)||(r==0)){
temp=num[r];
numfinal=numfinal+temp+" ";
}
else if((o<n)||(o=n)){
int w=n;
temp=num[r]+num[r+1];
n=atoi(temp.c_str());
if(n<w){
int a=1;
int q=r+2;
while(n<w){
temp=temp+num[q];
n=atoi(temp.c_str());
p++;
a++;
}
numfinal=numfinal+temp+" ";
r=r+a;
}
else{
numfinal=numfinal+temp+" ";
r++;
}
}
}
cout<<numfinal<<endl;
}
int main(){
string a;
string num[20];
for(int r=0;r<5;r++){
input(a,num);
}
return 0;
}
答案 0 :(得分:1)
此代码有效。但是不要忘记编写一个简单的代码并使用新的C ++编程风格。
#include <vector>
using namespace std;
vector<string> Input( )
{
string a;
cin >> a;
vector<string> num;
string current("-1");
string str;
for(auto c : a)
{
str.append(1, c);
if (stoi(str) > stoi(current) )
{
num.push_back(str);
current = str;
cout << str << " ";
str = "";
}
}
cout << endl;
return num;
}
int main() {
for (int i = 0; i<5; i++) {
vector<string> num;
num = Input();
}
return 0;
}
答案 1 :(得分:0)
您的while循环中似乎缺少q++
:
while(n < w) {
temp = temp + num[q];
n = atoi(temp.c_str());
p++;
a++;
q++;
}
这就是第四个第三位被复制的原因。
maximal munch algorithm可能会为您提供一些解决此问题的更简洁方法的灵感。它用于标记,但它可能会有所帮助。祝你好运!