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
}
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其實差不多了
要再省就是要把絕對不可能的數隔出來建表(範圍),不要讓程式去算這些數
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 了