2 <= a <= 5 と 2 <= b <= 5について, aのb乗を全て考えてみよう:
2の2乗= 4 , 2の3乗= 8 , 2の4乗= 16 , 2の5乗= 32
3の2乗= 9 , 3の3乗= 27 , 3の4乗= 81 , 3の5乗= 243
4の2乗=16 , 4の3乗= 64 , 4の4乗=256 , 4の5乗=1024
5の2乗=25 , 5の3乗=125 , 5の4乗=625 , 5の5乗=3125
これらを小さい順に並べ, 同じ数を除いたとすると, 15個の項を得る:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
2 <= a <= 100, 2 <= b <= 100 で同じことをしたとき、いくつの異なる項が存在するか?
#include <string>
#include <vector>
#include <Windows.h>
#include <valarray>
#include <algorithm>
const int LowerP = 2;
//const int UpperP = 5;
const int UpperP = 100;
std::string DeriveJyousuu(int a, int b);
void main()
{
std::vector<std::string> JyousuuVect;
for (int a = LowerP; a <= UpperP; a++) {
for (int b = LowerP; b <= UpperP; b++) {
JyousuuVect.push_back(DeriveJyousuu(a,b));
}
}
std::sort(JyousuuVect.begin(),JyousuuVect.end());
JyousuuVect.erase(std::unique(JyousuuVect.begin(),JyousuuVect.end()),JyousuuVect.end());
int rn=0;
for(std::vector<std::string>::iterator it=JyousuuVect.begin();it!=JyousuuVect.end();it++){
printf("%d番目は、%s\n",++rn,it->c_str());
}
}
std::string DeriveJyousuu(int a, int b)
{
std::string WillReturn = "";
std::valarray<int> JyousuuArr(0,a+1);
for(int I=2;I<=(int)JyousuuArr.size()-1;I++){
while (a % I == 0) {
JyousuuArr[I]++;
a /= I;
}
JyousuuArr[I] *= b;
}
for (int I = 2; I <= (int)JyousuuArr.size()-1; I++) {
if (JyousuuArr[I] != 0) {
char WKStr[100];
wsprintf(WKStr,"%dの%d乗+",I,JyousuuArr[I]);
WillReturn += WKStr;
}
}
return WillReturn;
}