整数分解中的小间距

时间:2016-01-12 18:13:31

标签: c++

我必须将一个数字加到其乘法中,每个数字用*(乘法符号)分隔。但是,当一个数字完全相乘(即,没有更多的倍数)时,预计会有一个空格而不是*。我已经完成了大部分程序,但是间距让我感到困惑并且给了我一个错误的答案,每个答案中都有一个额外的答案" set"超过必要(这将在代码后显示)。任何解决方案/建议? (我知道我的代码强制我在每个号码后添加*,但是,我不知道如何制作它以便它不会添加另一个号码。

#include <iostream>
using namespace std;
int main() 
{
 long int a, numb, mult;
 cin>>a;
 for (int i=0; i<a; i++)
 {
     cin>>numb;
     int mult =2;
      do{
         if (numb%mult==0)
         {numb/=mult;
          cout<<mult<<"*";
          mult=2; }//reset to two everytime it works
         else
         mult++;
         if (mult==numb)
         {cout<<" ";}
        } while (mult<numb+1);
  }
}

输入:

24
748931598137
466275117851
1314968912503
22379700293
1447643167643
1661926271899
2791977129181
1011164951317
654894646933
5597103144649
3057631770959
1161087606193
20104997131
834666701749
1609453631861
6967357950821
672835916659
1836903165421
1249178869333
858443597863
509391258631
1046982843367
2449157951257
1207036282367

输出:

109*137*277*331* 547*61*71*431*439* 569*113*197*239*439* 563*181*421*509* 577*53*241*431*439* 599*127*199*271*431* 563*97*241*449*461* 577*163*223*229*331* 367*83*107*307*401* 599*281*313*317*367* 547*193*223*257*491* 563*101*181*311*443* 461*197*347*491* 599*137*211*257*283* 397*127*233*271*419* 479*223*331*389*431* 563*107*157*283*307* 461*107*281*331*379* 487*197*233*233*271* 431*101*239*271*281* 467*61*73*353*541* 599*157*211*223*239* 593*79*283*431*433* 587*67*257*349*353* 569*

预期:

109*137*277*331*547 61*71*431*439*569 113*197*239*439*563 181*421*509*577 53*241*431*439*599 127*199*271*431*563 97*241*449*461*577 163*223*229*331*367 83*107*307*401*599 281*313*317*367*547 193*223*257*491*563 101*181*311*443*461 197*347*491*599 137*211*257*283*397 127*233*271*419*479 223*331*389*431*563 107*157*283*307*461 107*281*331*379*487 197*233*233*271*431 101*239*271*281*467 61*73*353*541*599 157*211*223*239*593 79*283*431*433*587 67*257*349*353*569

空白输出的替代程序:

#include <iostream>
using namespace std;
int main() 
{
 long int a, numb, mult;
 bool prime = false;
 cin>>a;
 for (int i=0; i<a; i++)
 {
     cin>>numb;
     int mult;
      do{mult=2;
         if (numb%mult==0)
         {numb/=mult;
          cout<<mult;
          mult=2;       //reset to two everytime it works
             prime= true;    } 
         else
         mult++;
         if (prime==true)
         {
             for (int mult=2; mult<numb+1; mult++)
             {if (numb%mult==0) //can it be further multiplied?
             cout<<"*"; 
             break;} //we're just testing for one time
         }
         if (mult==numb)
         {cout<<" ";}
        } while (mult<numb+1);
  }
}

1 个答案:

答案 0 :(得分:0)

这是我在清理完代码后最终得到的结果。 关键是在打印'*'字符之前检查您是否完成了编号因素。

#include <iostream>
using namespace std;

int main() 
{
    long int a, numb, mult;
    cin>>a;
    for (int i=0; i<a; i++)
    {
        cin>>numb;
        int mult =2;
        do{
            if (numb % mult == 0)
            {
                numb /= mult;
                cout << mult;
                if(numb == 1)
                    cout << ' ';
                else
                    cout << '*';
            }
            else
                mult++;
        } while (numb != 1);
    }
    cout << '\n';
}

例:
输入:3 5000 4999 4998
输出:2*2*2*5*5*5*5 4999 2*3*7*7*17