user-0 提问: C语言新手问题，一个二位数的13次方的最后三位数

回复:
user: user-1
content: 引用 5 楼 fly_dragon_fly 的回复:一个两个数的13次方太大了，你只要最后三位没必要保留其它位了， 每次乘之后把结果模1000， 最后就得到答案了 提供一个无优化版的  int power_last3(int n ,int p) {     int r=n;     while(--p){         r*=n;         if(r>=1000) r %=1000;     }     return r; }楼上正解

user: user-2
content: 一个两个数的13次方太大了，你只要最后三位没必要保留其它位了， 每次乘之后把结果模1000， 最后就得到答案了 提供一个无优化版的  int power_last3(int n ,int p) {     int r=n;     while(--p){         r*=n;         if(r>=1000) r %=1000;     }     return r; }

user: user-3
content: 仅供参考#include <iostream> #include <string> #include <algorithm> using namespace std; int COMPARE(string number1, string number2) {     int i,j;      int length1 = number1.size();     int length2 = number2.size();      if(number1.size() == 0) number1 = "0";     if(number2.size() == 0) number2 = "0";      j = 0;     for(i = 0; i < length1; ++i) {         if(number1[i] == '0') ++j;         else break;     }     number1 = number1.substr(j);      j = 0;     for(i = 0; i < length2; ++i) {         if(number2[i] == '0') ++j;         else break;     }     number2 = number2.substr(j);      length1 = number1.size();     length2 = number2.size();      if(length1 > length2) {         return 1;     } else if(length1 == length2) {         if(number1.compare(number2) > 0) {             return 1;         } else if(number1.compare(number2) == 0) {             return 0;         } else {             return -1;         }     } else {         return -1;     }      return 0; } string PLUS(string number1,string number2) {     int i;     int length1 = number1.size();     int length2 = number2.size();      string result="";      reverse(number1.begin(), number1.end());     reverse(number2.begin(), number2.end());      for(i = 0; i < length1 && i < length2; i++) {         char c = (char)(number1[i] + number2[i] - 48);         result = result + c;     }      while(i < length1) {         result = result + number1[i];         ++i;     }      while(i < length2) {         result = result + number2[i];         ++i;     }      int carry = 0;     for(i = 0; i < (int)result.size(); ++i) {         int value = result[i] - 48 + carry;         result[i] = (char)(value % 10 + 48);         carry = value / 10;     }      if(carry !=0 ) {         result = result + (char)(carry + 48);     }      for(i = result.size() - 1; i >= 0; i--) {         if(result[i] != '0') break;     }      result = result.substr(0, i + 1);      reverse(result.begin(), result.end());     if(result.length() == 0) result = "0";     return result; } string MINUS(string number1,string number2) {     int i;     string result = "";      int length1 = number1.size();     int length2 = number2.size();      if(COMPARE(number2,number1) > 0) {         return "-" + MINUS(number2, number1);     }      reverse(number1.begin(),number1.end());     reverse(number2.begin(),number2.end());      for(i = 0; i < length1 && i < length2; i++) {         char c = number1[i] - number2[i] + 48;         result = result + c;     }      if(i < length1) {         for(; i < length1; i++) {             result = result + number1[i];         }     }      int carry = 0;     for(i = 0; i < (int)result.length(); i++) {         int value = result[i] - 48 + carry;         if(value < 0) {             value = value + 10;             carry = -1;         } else carry = 0;         result[i]=(char)(value + 48);     }      for(i = result.size() - 1; i >= 0; i--) {         if(result[i] != '0')break;     }      result = result.substr(0, i+1);      reverse(result.begin(), result.end());     if(result.length()==0) result = "0";     return result; } string MULTIPLY(string number1, string number2) {     int i, j;     int *iresult;     int length1 = number1.size();     int length2 = number2.size();     string result = "";      reverse(number1.begin(), number1.end());     reverse(number2.begin(), number2.end());      iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));     memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));      for(i = 0; i < length1; i++) {         for(j = 0; j < length2; j++) {             iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));         }     }      int carry = 0;     for(i = 0; i < length1 + length2; i++) {         int value = iresult[i] + carry;         iresult[i] = value % 10;         carry = value / 10;     }      for(i = length1 + length2 - 1; i >= 0; i--) {         if(iresult[i] != 0)break;     }      for(; i >= 0; i--) {         result = result + (char)(iresult[i]+48);     }      free(iresult);      if(result == "") result = "0";     return result; } string factorial(string n) {     string temp = "1";     string i;     for(i = "1"; COMPARE(i, n) <= 0; i = PLUS(i, "1")) {         temp = MULTIPLY(temp, i);     }     return temp; } int main(void) {     cout << factorial("100") << endl;     return 0; }

user: user-4
content: 要考虑到越界的情况，99^13次方已经超过int能表示的范围了。

user: user-5
content: 错了，pow返回是double 或float,

user: user-5
content: 需要int i