今天刷了一道蓝桥杯的习题,题目的要求如下:
立方尾不变
有些数字的立方的末尾正好是该数字本身。
比如:1,4,5,6,9,24,25,....
请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。
请提交该整数,不要填写任何多余的内容。
答题思路:
1. 首先这道题没有对时间和内存做要求,所以可以采用穷举法,当然了肯定是越简单越好。
2. 由于10000内正整数的立方是一个很大的数,所以要用long long 类型来保存。
3. 比如说25的立方为15625,这个数就满足题的要求。25是一个两位数,我们只需要取出15625的后两位,来与25比较,判断是否相等。相等满足题的要求,则记录下来。
好吧,思路就说到这里,下面给出源代码。
代码如下:
ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
long long lng = 1;
long int count = 0;
int bit;
int j = 0;
long long end=0;
long long mod = 0;
long long temp = 0;
for (int i =1; i<10000; i++)
{
lng = 1;
bit = 1;
end = 0;
mod = 0;
j = 0;
temp = i;
lng = (long long )pow(temp, 3);//pow( )函数的返回值类型为double,所以强制转换为long long 类型
while (temp >0)//判断i是几位数,取余的时候则循环几次。
{
++j;//求i是几位数,取余的时候共参考。
temp = temp / 10;
}
while (j-- > 0)
{
bit = bit * 10;
}
end = lng%bit;//根据i的位数,来判断取余的时候取几位。
if (end == i)
{
count++;
cout << i << endl;//用于调试,让用户看的更直接。
}
}
cout << count << endl;
system("pause");
return 0;
}
运行截图:
额加福利:
可能会有朋友些代码的时候遇见这种情况。
为什么lng=3751*3751*3751的结果不对呢?
3751*3751*3751,这个操作实际上系统在处理的时候默认是int的操作,int是32位的,其取值范围-2147483648~2147483647,也就是说根本放不下结果,所以给出的答案是错误的。
你改成下面这种就对了:
#include
using namespace std;
int main()
{
long long a = 3751;
cout<
}
而 pow的话是系统函数,会用double来进行运算,double有64位,完全可以放下结果,所以运算的结果是正确的。