一道C++题
c吧
全部回复
仅看楼主
level 1
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗?
以下是我编的程序
#include <iostream>
using namespace std;
int main()
{
int num, i, p1, p2;
int a[10], b[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (num = 32; num <= 99; num++)
{
p1 = num*num;
p2 = num*num*num;
a[0] = p1 % 10;
a[1] = p1 / 10 % 10;
a[2] = p1 / 100 % 10;
a[3] = p1 / 1000 % 10;
a[4] = p2 % 10;
a[5] = p2 / 10 % 10;
a[6] = p2 / 100 % 10;
a[7] = p2 / 1000 % 10;
a[8] = p2 / 10000 % 10;
a[9] = p2 / 100000 % 10;
for (i = 1; i <= 9; i++)
{
b[a[i]]++;
}
if (b[0] == 1 && b[1] == 1 && b[2] == 1 && b[3] == 1 && b[4] == 1 && b[5] == 1
&& b[6] == 1 && b[7] == 1 && b[8] == 1 && b[9] == 1)
break;
}
cout << num;
return 0;
}
已经笨笨地硬算。。。
但运行结果 果断就是100[惊哭]丧病。。。
请教大神。。。 错在哪
另:判断数组a[10]中各个数互不相等该怎么做。 已知所有元素都是0~9之间的数字
2015年04月21日 15点04分 1
level 1
求不要沉。。。。
2015年04月21日 15点04分 2
level 1
困惑我一晚上了。。[惊哭][惊哭][惊哭]
2015年04月21日 15点04分 3
level 10
#include <iostream>
using namespace std;
int main()
{
int num, i, p1, p2;
int a[10], b[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (num = 32; num <= 99; num++)
{
p1 = num*num;
p2 = num*num*num;
a[0] = p1 % 10;
a[1] = p1 / 10 % 10;
a[2] = p1 / 100 % 10;
a[3] = p1 / 1000 % 10;
a[4] = p2 % 10;
a[5] = p2 / 10 % 10;
a[6] = p2 / 100 % 10;
a[7] = p2 / 1000 % 10;
a[8] = p2 / 10000 % 10;
a[9] = p2 / 100000 % 10;
for (i = 0; i <= 9; i++)
{
b[a[i]]++;
}
if (b[0] == 1 && b[1] == 1 && b[2] == 1 && b[3] == 1 && b[4] == 1 && b[5] == 1
&& b[6] == 1 && b[7] == 1 && b[8] == 1 && b[9] == 1)
break;
memset(b,0,sizeof(b));
}
cout << num;
return 0;
}
改动就是嵌套的for从0开始,还有一个b数组清零……最想吐槽这种方法有点笨啊……[喷]
2015年04月21日 15点04分 4
清零为什么不在大循环内部进行
2015年04月21日 15点04分
回复
䲛��ۛ��ļǵ�
:就是在大循环内部啊
2015年04月22日 15点04分
≧﹏≦
2016年03月06日 02点03分
level 1
清零不应该在循环内进行吗
2015年04月21日 15点04分 5
level 13
深奥不懂[滑稽]
2015年04月21日 17点04分 6
level 11
确实是 b[i] 没有清零的问题, 我刚才做了, 答案是69
4 楼的那个清零应该是错误的, 应该放到 if() 外面来
另外起始数据其实不应该是32, 而是47, 因为 46*46*46=97336<100000
平方 4 位数, 立方6 位数
这是我的代码
#include <iostream>
using namespace std;
int main()
{
int num, i, p1, p2, test;
int a[10], b[10];
for(num = 47; num <=99; ++num)
{
for(i = 0; i <= 9; ++i)
{
b[i] = 0;
}
p1 = num * num;
p2 = num * num * num;
a[0] = p1 % 10;
a[1] = (p1 / 10) % 10;
a[2] = (p1 / 100) % 10;
a[3] = p1 / 1000;
a[4] = p2 % 10;
a[5] = (p2 / 10) % 10;
a[6] = (p2 / 100) % 10;
a[7] = (p2 / 1000) % 10;
a[8] = (p2 / 10000) % 10;
a[9] = p2 / 100000;
for(i = 0; i <=9; ++i)
{
b[a[i]]++;
}
for(i = 1; i <=9; ++i)
{
b[0] &= b[i];
}
if(1 == b[0])
{
break;
}
}
cout <<num <<endl;
return 0;
}
2015年04月21日 23点04分 7
4 楼说的嵌套的 i 从 0 开始也是对的, 你要注意.
2015年04月21日 23点04分
[真棒][真棒][真棒]明白了
2015年04月22日 01点04分
我就是写在if外面了啊……
2015年04月22日 15点04分
回复
ҩҩO�п���S
:soory,我眼拙了,我习惯于if加花括号,粘贴到贴吧缩进也变了,所以看差了[吐舌]
2015年04月22日 22点04分
level 11
至于 "另:判断数组a[10]中各个数互不相等该怎么做。 已知所有元素都是0~9之间的数字"
我觉得你做的很好了, 计算机中很多 "土" 办法等同于好办法
要是让我想, 说不定我先来个排序然后逐一判断是不是 0 到 9
2015年04月21日 23点04分 9
对啊 刚开始 我还在想有没有复杂度更少的 时间和空间复杂度目前我还没想到比楼主好的[不高兴]
2015年04月22日 04点04分
回复 樱花草凌乱我心 :想了一晚上...[泪][泪][泪]
2015年04月22日 12点04分
回复
䲛��ۛ��ļǵ�
:以后注意点细节 其实你这个错误啊你只要知道调试监视变量就会很快发现呢 以后多学学调试受益很多的
2015年04月22日 12点04分
回复 樱花草凌乱我心 :嗯嗯...现在还没有用调试那个意识
2015年04月24日 07点04分
level 11
加了个油
世间事 除了生死 哪一件不是闲事
   --来自菩提老祖的客户端
2015年04月22日 23点04分 10
level 2
答案是18我前两天才做了
2015年04月23日 00点04分 12
额... 不是这道... 是一道很相似的
2015年04月24日 07点04分
level 6
我操,蓝桥呗的题目。好像是63吧
2015年04月25日 13点04分 13
69
2015年04月25日 14点04分
回复 洳淉眼涙吥记得 :哦。记错啦
2015年04月25日 23点04分
level 7
最好还是用个map或者set吧
也可以换个思路。把数字转成字符串然后排下序,看等不等于 “0123456789”就行了。代码很少:
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
for (auto i = 1; i < 100; ++i) {
std::string s = to_string(i*i) + to_string(i*i*i);
std::sort(s.begin(), s.end());
cout << s << endl;
if(s.compare("0123456789") == 0 ) {
cout << i << endl;
break;
}
}
return 0;
}
2015年04月25日 15点04分 14
level 9
顶一个,就走,菜鸟路过
2015年04月26日 00点04分 15
level 12
说的好,换个方式思考,厉害
2015年04月26日 00点04分 16
level 1
#include<stdio.h>
void Split (int j ,int k, int s[],int* out) //数的拆分
{
int i=0;
int w=j,w_1=k;
int d;
while(w>0)
{
d=j%10;
s[i] = d;
j=(j-s[i])/10;
i++;
w=w/10;
}
while(w_1>0)
{
s[i]=k%10;
k=(k-s[i])/10;
i++;
w_1=w_1/10;
}
*out = i;
}
int CheckNum (int c[]) //检查数字是否为0-9;
{
int j,i,t,shi=0;
for(j=0;j<10;j++)
{
for(i=0;i<9-j;i++)
{
if(c[i]>c[i+1])
{
t=c[i];
c[i]=c[i+1];
c[i+1]=t;//冒泡比较大小,从小到大排列
}
}
}
for(j=0;j<10;j++)
{
if(c[j]==j)//判断十个数,排序从0-9;
{
shi++;
}
else break;
}
if(shi == 10)
return 1;
return 0;
}
int main()
{
int s[10];
int p,i,N;
long pf,lf;
for (long j = 1; j<1000000000; j++)
{
pf=j*j;
lf=j*j*j;
Split (pf,lf,s,&N);
int d = CheckNum(s);
if(d==1 && N == 10)
{
printf("%d",j);
break;
}
}
return 0;
}
刚刚写的 这个应该比较好理解
2016年03月02日 05点03分 17
level 9
我算出来的是69
2016年05月20日 03点05分 20
level 1
你少了一步判断
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int main()
{
int num, i,j, p1, p2,t;
int a[10], b[10];
for (num = 47; num <= 99; num++)
{
t=0;
for(i=0;i<10;i++)
{
b[i]=0;
}
p1 = num*num;
p2 = num*num*num;
a[0] = p1 % 10;
a[1] = (p1 / 10) % 10;
a[2] = (p1 / 100) % 10;
a[3] = (p1 / 1000) % 10;
a[4] = p2 % 10;
a[5] = (p2 / 10) % 10;
a[6] = (p2 / 100) % 10;
a[7] = (p2 / 1000) % 10;
a[8] = (p2 / 10000) % 10;
a[9] = (p2 / 100000) % 10;
for (i = 0; i <10; i++)
{
for(j=0;j<10;j++)
{
if(a[i]==j)
{
b[a[i]]++;
}
}
}
for(i=0;i<10;i++)
{
if(b[i]!=1)
{
t=t+1;
}
}
if(t==0)
{
printf("%d",num);
}
}
return 0;
}
2018年04月26日 13点04分 23
1