#11153: 68ms C++ 請教如何加快


uopsdod (samcom)

學校 : 不指定學校
編號 : 57407
來源 : [101.15.154.210]
最後登入時間 :
2019-07-14 16:59:15
a040. 阿姆斯壯數 | From: [140.115.236.39] | 發表日期 : 2016-07-10 09:45

MyCode(好看版)
http://ideone.com/ARqKJ9

#include <iostream>
#include <cmath>
using namespace std;

int getDigits(int tmpNo){
int digit = 1;
while(tmpNo / 10){
digit++;
tmpNo = tmpNo/10;
}
return digit;
}

double convertNo(int tmpNo,int digit){
double iToNum = 0;
while(tmpNo) {
iToNum += (pow(tmpNo%10,digit)); // int iToNum not working ???
tmpNo = tmpNo / 10;
}
return iToNum;
}

int main(){

int n = 0;
int m = 0;
while(cin >> n >> m){
bool hasArmsNo = false;
for (int i = n; i <= m; i++) {
if (convertNo(i,getDigits(i)) == (double)i) {
hasArmsNo = true;
cout << i << " ";
}
}// end for
if ((hasArmsNo) == false){
cout << "none";
}
cout << endl;
}// end while
}

 
#11166: Re:68ms C++ 請教如何加快


iven00000000 (羽音穎次方)

學校 : 國立臺灣科技大學
編號 : 48522
來源 : [61.219.144.211]
最後登入時間 :
2017-10-20 15:22:23
a040. 阿姆斯壯數 | From: [111.243.177.233] | 發表日期 : 2016-07-15 01:46

MyCode(好看版)
http://ideone.com/ARqKJ9

#include
#include
using namespace std;

int getDigits(int tmpNo){
int digit = 1;
while(tmpNo / 10){
digit++;
tmpNo = tmpNo/10;
}
return digit;
}

double convertNo(int tmpNo,int digit){
double iToNum = 0;
while(tmpNo) {
iToNum += (pow(tmpNo%10,digit)); // int iToNum not working ???
tmpNo = tmpNo / 10;
}
return iToNum;
}

int main(){

int n = 0;
int m = 0;
while(cin >> n >> m){
bool hasArmsNo = false;
for (int i = n; i <= m; i++) {
if (convertNo(i,getDigits(i)) == (double)i) {
hasArmsNo = true;
cout << i << " ";
}
}// end for
if ((hasArmsNo) == false){
cout << "none";
}
cout << endl;
}// end while
}

1. 把cout cin 換成printf scanf

2.每抓到一位數就乘四次方加起來,就不用做convertNo getDigits,這兩個運算有重疊

3.假如資料量大或許建表有用,一開始就把1~9的四次方算好存成陣列(這要測一下才知道哪個快)

我只想到這些。我自己沒建表,只做第2點,時間也是68ms 所以68ms其實差不多了

要再省就是要把絕對不可能的數隔出來建表(範圍),不要讓程式去算這些數

 
#13607: Re:68ms C++ 請教如何加快


snakeneedy (蛇~Snake)

學校 : 國立高雄師範大學附屬高級中學
編號 : 7661
來源 : [114.40.8.251]
最後登入時間 :
2023-01-25 19:16:06
a040. 阿姆斯壯數 | From: [218.164.125.30] | 發表日期 : 2018-03-29 09:48

MyCode(好看版)
http://ideone.com/ARqKJ9

#include <iostream>
#include <cmath>
using namespace std;

int getDigits(int tmpNo){
  int digit = 1;
  while(tmpNo / 10){
    digit++;
    tmpNo = tmpNo/10;
  }
  return digit;
}

double convertNo(int tmpNo,int digit){
  double iToNum = 0;
  while(tmpNo) {
    iToNum += (pow(tmpNo%10,digit)); // int iToNum not working ???
    tmpNo = tmpNo / 10;
  }
  return iToNum;
}

int main(){

  int n = 0;
  int m = 0;
  while(cin >> n >> m){
    bool hasArmsNo = false;
    for (int i = n; i <= m; i++) {
      if (convertNo(i,getDigits(i)) == (double)i) {
        hasArmsNo = true;
        cout << i << " ";
      }
    }// end for
    if ((hasArmsNo) == false){
      cout << "none";
    }
    cout << endl;
  }// end while
}

1. 把cout cin 換成printf scanf

2.每抓到一位數就乘四次方加起來,就不用做convertNo getDigits,這兩個運算有重疊

3.假如資料量大或許建表有用,一開始就把1~9的四次方算好存成陣列(這要測一下才知道哪個快)

我只想到這些。我自己沒建表,只做第2點,時間也是68ms 所以68ms其實差不多了

要再省就是要把絕對不可能的數隔出來建表(範圍),不要讓程式去算這些數

cmath 的 pow() 很耗時間,改成自訂的

int mypow(int base, int exponent) {
  int result = 1;
  while (exponent--) result *= base;
  return result;
}

就能拿到 0ms 了

 
ZeroJudge Forum